/ Hex Artifact Content
Login

Artifact d8cdf331ad08650fc8397eee79b55548070077b0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 20 20  on */..#endif.  
22c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
22d0: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
22e0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
22f0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
2300: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
2310: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f  ite3_int64 mmapO
2320: 72 69 67 73 69 7a 65 3b 20 20 20 20 20 2f 2a 20  rigsize;     /* 
2330: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2340: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
2350: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
2360: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d 69  3_int64 mmapLimi
2370: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t;        /* Con
2380: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
2390: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23a0: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
23b0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
23c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
23d0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
23e0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
2410: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
2420: 72 65 66 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20  refs */..#ifdef 
2430: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2440: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2450: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2460: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2470: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
2480: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
2490: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
24a0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
24b0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
24c0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
24d0: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
24e0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
24f0: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2500: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2510: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2520: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2530: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2540: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2550: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2560: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2570: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2580: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
2590: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
25a0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
25b0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
25c0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
25d0: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
25e0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
25f0: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2600: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2610: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2620: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2630: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2640: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2650: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2660: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2670: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
2680: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
2690: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
26a0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
26b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
26c0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
26d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26e0: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
26f0: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2700: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2710: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2720: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2730: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2740: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2750: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2760: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2770: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
2780: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
2790: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
27a0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
27b0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
27c0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
27d0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
27e0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
27f0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2800: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2810: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2820: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2830: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2840: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2850: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2860: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2870: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2880: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2890: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
28a0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
28b0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
28c0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
28d0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
28e0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
28f0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2900: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2910: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2920: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2930: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2940: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2950: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2960: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2970: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2980: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2990: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
29a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
29b0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
29c0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
29d0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
29e0: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
29f0: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2a00: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2a10: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2a20: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2a30: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2a40: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2a50: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2a60: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2a70: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
2a80: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
2a90: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
2aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
2ab0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
2ac0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2ad0: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2ae0: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2af0: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2b00: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2b10: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2b20: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2b30: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2b40: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2b50: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2b60: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
2b70: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
2b80: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
2b90: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
2ba0: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
2bb0: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
2bc0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
2bd0: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
2be0: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
2bf0: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
2c00: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
2c10: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
2c20: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
2c30: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
2c40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2c50: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
2c60: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
2c70: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
2c80: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
2c90: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
2ca0: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
2cb0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2cc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2cd0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2ce0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2d00: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2d10: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2d20: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2d30: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2d40: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2d50: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2d60: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2d70: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2d80: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2d90: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2da0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2db0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2dc0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2dd0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2de0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2df0: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2e00: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2e10: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2e20: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e40: 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c  of the sytem cal
2e50: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
2e60: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
2e70: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
2e80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
2e90: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2ea0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2eb0: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
2ec0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
2ed0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
2ee0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
2ef0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2f00: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
2f10: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
2f20: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
2f30: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2f40: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
2f50: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
2f60: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
2f70: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2f80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
2f90: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
2fa0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
2fb0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2fc0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2fd0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
2fe0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
2ff0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3000: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
3010: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
3020: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
3030: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3040: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
3050: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3060: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
3070: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3080: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
3090: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
30a0: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
30b0: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
30c0: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
30d0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
30e0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
30f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3100: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
3110: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
3120: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
3130: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
3140: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3150: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
3160: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
3170: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
3180: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
3190: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
31a0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
31b0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
31c0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
31d0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
31e0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
31f0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
3200: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
3210: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
3220: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
3230: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
3240: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
3250: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
3260: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
3270: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
3280: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
32a0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
32b0: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
32c0: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
32d0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
32e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
32f0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
3300: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3310: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
3320: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
3330: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
3340: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
3350: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
3360: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3370: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
3380: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
3390: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
33a0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
33b0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
33c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
33d0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
33e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
33f0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
3400: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3410: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
3420: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
3440: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
3450: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
3460: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3470: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
3480: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
3490: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
34a0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34b0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
34c0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
34d0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
34e0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
34f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3500: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
3510: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3520: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
3530: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
3540: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
3550: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3560: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3570: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3580: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3590: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
35a0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
35b0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
35c0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
35d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
35e0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
35f0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3600: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3610: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
3620: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
3630: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3640: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3650: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3660: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3670: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3680: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
3690: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
36a0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
36b0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
36c0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
36d0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
36e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
36f0: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
3700: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
3710: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3720: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3730: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3740: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3750: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3760: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
3770: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3780: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
3790: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
37a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
37b0: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
37c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
37d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
37e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
37f0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3800: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3810: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
3820: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3830: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3840: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3860: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
3870: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3880: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
3890: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
38a0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
38b0: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
38c0: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
38d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
38e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
38f0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3900: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3910: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
3920: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
3930: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
3940: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3950: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3960: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3970: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3980: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3990: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
39a0: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
39b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
39c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
39d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
39e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
39f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a00: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3a10: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3a20: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3a30: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3a40: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3a50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3a60: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3a70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3a80: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3a90: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3aa0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3ad0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3ae0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3af0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3b00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3b10: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3b20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b30: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3b40: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b50: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3b60: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b70: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3b80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3b90: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
3ba0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3bb0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
3bc0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
3bd0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
3be0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
3bf0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3c00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3c10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3c30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3c50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3c70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3c80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3c90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3ca0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3cb0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3cc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3cd0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ce0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3cf0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3d00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3d10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3d20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3d30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
3d50: 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30 20  ixFchown,     0 
3d60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3d70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3d80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3d90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3da0: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
3db0: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
3dc0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3dd0: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
3de0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
3df0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
3e00: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
3e10: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
3e20: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
3e30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3e40: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
3e50: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
3e60: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
3e70: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
3e80: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
3e90: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
3ea0: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
3eb0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
3ec0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
3ed0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
3ee0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
3ef0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
3f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
3f10: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
3f20: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
3f30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
3f40: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3f50: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
3f60: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
3f70: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3f80: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
3f90: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
3fa0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
3fb0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
3fc0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
3fd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
3fe0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
3ff0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4000: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4010: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4020: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4030: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4040: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4050: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4060: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4070: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4080: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4090: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
40a0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
40b0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
40c0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
40d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
40f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4100: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4110: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4120: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4140: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4150: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4160: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4170: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4180: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4190: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
41a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
41b0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
41c0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
41d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
41e0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
41f0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4200: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4210: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4220: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4230: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4240: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4250: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4260: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4270: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4280: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4290: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
42a0: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
42b0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
42c0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
42d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
42e0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
42f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4300: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4320: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4330: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4340: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4350: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4360: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4370: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4380: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4390: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
43a0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
43b0: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
43c0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
43d0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
43e0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
43f0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4400: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4410: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
4420: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
4430: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
4440: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4450: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
4460: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4470: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
4480: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
4490: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
44a0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
44b0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
44c0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
44d0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
44e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
44f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4500: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4510: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
4520: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
4530: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
4540: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
4550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4560: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
4570: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4580: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
4590: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
45a0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
45b0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
45c0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
45d0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
45e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
45f0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
4600: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
4610: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4620: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4630: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
4640: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
4650: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
4660: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4670: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
4680: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4690: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
46a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
46b0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
46d0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
46e0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
46f0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4700: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
4710: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
4720: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
4730: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4740: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e  *.** Invoke open
4750: 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69  ().  Do so multi
4760: 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c  ple times, until
4770: 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65   it either succe
4780: 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20  eds or.** fails 
4790: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20  for some reason 
47a0: 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52  other than EINTR
47b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
47c0: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
47d0: 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20  e "m" is 0 then 
47e0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65  set it to the de
47f0: 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c  fault for.** SQL
4800: 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ite.  The defaul
4810: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41  t is SQLITE_DEFA
4820: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4830: 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a  IONS (normally.*
4840: 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66  * 0644) as modif
4850: 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65  ied by the syste
4860: 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69  m umask.  If m i
4870: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a  s not 0, then.**
4880: 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63   make the file c
4890: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20  reation mode be 
48a0: 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69  exactly m ignori
48b0: 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  ng the umask..**
48c0: 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65  .** The m parame
48d0: 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d  ter will be non-
48e0: 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63  zero only when c
48f0: 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a  reating -wal, -j
4900: 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d  ournal,.** and -
4910: 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77  shm files.  We w
4920: 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20  ant those files 
4930: 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79  to have *exactly
4940: 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65  * the same.** pe
4950: 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65  rmissions as the
4960: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
4970: 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61  base, unadultera
4980: 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
4990: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79  ..** In that way
49a0: 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  , if a database 
49b0: 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72  file is -rw-rw-r
49c0: 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20  w or -rw-rw-r-, 
49d0: 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63  and a.** transac
49e0: 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64  tion crashes and
49f0: 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68   leaves behind h
4a00: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  ot journals, the
4a10: 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73  n any.** process
4a20: 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f   that is able to
4a30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
4a40: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f  tabase will also
4a50: 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72   be able to.** r
4a60: 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a  ecover the hot j
4a70: 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ournals..*/.stat
4a80: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
4a90: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
4aa0: 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20  , int f, mode_t 
4ab0: 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  m){.  int fd;.  
4ac0: 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20  mode_t m2 = m ? 
4ad0: 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m : SQLITE_DEFAU
4ae0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4af0: 4f 4e 53 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  ONS;.  do{.#if d
4b00: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
4b10: 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  ).    fd = osOpe
4b20: 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c  n(z,f|O_CLOEXEC,
4b30: 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  m2);.#else.    f
4b40: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d  d = osOpen(z,f,m
4b50: 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 77 68  2);.#endif.  }wh
4b60: 69 6c 65 28 20 66 64 3c 30 20 26 26 20 65 72 72  ile( fd<0 && err
4b70: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 69  no==EINTR );.  i
4b80: 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
4b90: 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
4ba0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
4bb0: 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  atbuf;.      if(
4bc0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
4bd0: 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20 20  atbuf)==0 .     
4be0: 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74 5f    && statbuf.st_
4bf0: 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20 26  size==0.       &
4c00: 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  & (statbuf.st_mo
4c10: 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20 20  de&0777)!=m .   
4c20: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73     ){.        os
4c30: 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a 20  Fchmod(fd, m);. 
4c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
4c50: 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f 45   defined(FD_CLOE
4c60: 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e 65  XEC) && (!define
4c70: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c 20  d(O_CLOEXEC) || 
4c80: 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20 20  O_CLOEXEC==0).  
4c90: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
4ca0: 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
4cb0: 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
4cc0: 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
4cd0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
4ce0: 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n fd;.}../*.** H
4cf0: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
4d00: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
4d10: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
4d20: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
4d30: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
4d40: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
4d50: 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  t the unixInodeI
4d60: 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72  nfo and.** vxwor
4d70: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73  ksFileId objects
4d80: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69   used by this fi
4d90: 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
4da0: 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72   may be .** shar
4db0: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
4dc0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
4dd0: 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78  nction unixMutex
4de0: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
4df0: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
4e00: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
4e10: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
4e20: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
4e30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
4e40: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
4e50: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
4e60: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
4e70: 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  **.**   unixEnte
4e80: 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
4e90: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
4ea0: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
4eb0: 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29  unixEnterLeave()
4ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ed0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
4ee0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4ef0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
4f00: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4f10: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4f20: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
4f30: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
4f40: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
4f50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4f60: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
4f70: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4f80: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4f90: 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  ER));.}.#ifdef S
4fa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
4fb0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78  ic int unixMutex
4fc0: 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
4fd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
4fe0: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
4ff0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
5000: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
5010: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
5020: 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f...#if defined(
5030: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
5040: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5050: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  EBUG)./*.** Help
5060: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
5070: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
5080: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
5090: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
50a0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
50b0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
50c0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
50d0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
50e0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
50f0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5110: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5120: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5130: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5140: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5150: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5160: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
5170: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
5180: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
5190: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
51a0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
51b0: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
51c0: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
51d0: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
51e0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
51f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5200: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5210: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5220: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5230: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5240: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
5250: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5260: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
5270: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
5280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5290: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
52a0: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
52b0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
52c0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
52d0: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
52e0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
52f0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5300: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
5310: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
5320: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
5330: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
5340: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
5350: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
5360: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
5370: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
5380: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
5390: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
53a0: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
53b0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
53c0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
53d0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
53e0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
53f0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
5400: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
5410: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
5420: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
5430: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5440: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5450: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
5460: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
5470: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
5480: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
5490: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
54a0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
54b0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
54c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
54d0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
54e0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
54f0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
5500: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
5510: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
5520: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
5530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5540: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
5550: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
5560: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
5570: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
5580: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
5590: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
55a0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
55b0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
55c0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
55d0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
55e0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
55f0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
5600: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
5610: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
5620: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
5630: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
5640: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
5650: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
5660: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
5670: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
5680: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
5690: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
56a0: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
56b0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
56c0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
56d0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
56e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
56f0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
5700: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
5710: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
5720: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5730: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
5740: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
5750: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5760: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
5770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5780: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
5790: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
57a0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
57b0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
57c0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
57d0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
57e0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
57f0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
5800: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
5810: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
5820: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
5830: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
5840: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
5850: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
5860: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5870: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
5880: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
5890: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
58a0: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
58b0: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
58c0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
58d0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
58e0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
58f0: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
5900: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
5910: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
5920: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
5930: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
5940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5950: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
5960: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
5970: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
5980: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
5990: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
59a0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
59b0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
59c0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
59d0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
59e0: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
59f0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
5a00: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
5a10: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
5a20: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
5a30: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
5a40: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
5a50: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
5a60: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
5a70: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
5a80: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
5a90: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
5aa0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
5ab0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
5ac0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
5ad0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
5ae0: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
5af0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
5b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5b10: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
5b20: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
5b30: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
5b40: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
5b50: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
5b60: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
5b70: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
5b80: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
5b90: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
5ba0: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
5bb0: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
5bc0: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
5bd0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
5be0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
5bf0: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
5c00: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
5c10: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
5c20: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
5c30: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
5c40: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
5c50: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
5c60: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5c70: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
5c80: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
5c90: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
5ca0: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
5cb0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
5cc0: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
5cd0: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
5ce0: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
5cf0: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
5d00: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
5d10: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
5d20: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
5d30: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
5d40: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
5d50: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
5d60: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
5d70: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
5d80: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
5d90: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
5da0: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
5db0: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
5dc0: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
5dd0: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
5de0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5df0: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
5e00: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
5e10: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
5e20: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
5e30: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
5e40: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
5e50: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
5e60: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
5e70: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
5e80: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
5e90: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
5ea0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
5eb0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
5ec0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
5ed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5ee0: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
5ef0: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
5f00: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
5f10: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
5f20: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
5f40: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
5f50: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
5f60: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
5f70: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
5f80: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
5f90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
5fa0: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
5fb0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
5fc0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
5fd0: 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20  DLOCK) ||.      
5fe0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
5ff0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6000: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6010: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6020: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6030: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
6040: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
6050: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
6060: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6070: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f  E_PERM;.    .  /
6080: 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c  * EDEADLK is onl
6090: 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20  y possible if a 
60a0: 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f  call to fcntl(F_
60b0: 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e  SETLKW) is made.
60c0: 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d   And.  ** this m
60d0: 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65  odule never make
60e0: 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41  s such a call. A
60f0: 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53  nd the code in S
6100: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20  QLite itself .  
6110: 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
6120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6130: 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65  CKED is never re
6140: 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73  turned. For thes
6150: 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74  e reasons.  ** t
6160: 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
6170: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
6180: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f  If the system do
6190: 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20  es set errno to 
61a0: 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68  EDEADLK,.  ** th
61b0: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
61c0: 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20  _IOERR_XXX code 
61d0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
61e0: 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73  . */.#if 0.  cas
61f0: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6210: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64  RR_BLOCKED;.#end
6220: 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  if.    .#if EOPN
6230: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
6240: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
6250: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
6260: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
6270: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
6280: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
6290: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
62a0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
62b0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
62c0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
62d0: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
62e0: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
62f0: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
6300: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
6310: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
6320: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
6330: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
6340: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6350: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
6360: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
6370: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
6380: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
6390: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
63a0: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
63b0: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
63c0: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
63d0: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
63e0: 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45  ENOENT:.#ifdef E
63f0: 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20  STALE           
6400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54            /* EST
6410: 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  ALE is not defin
6420: 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79  ed on Interix sy
6430: 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20  stems */.  case 
6440: 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20  ESTALE:.#endif. 
6450: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
6460: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
6470: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
6480: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
6490: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
64a0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
64b0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
64c0: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
64d0: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
6540: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6550: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6560: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6570: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
6580: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
6590: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
65a0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
65b0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
65c0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
65d0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
65e0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
65f0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
6600: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
6610: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
6620: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
6630: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
6640: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
6650: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
6660: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
6670: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
6680: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6690: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
66a0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
66b0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
66c0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
66d0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
66e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
66f0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
6700: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
6710: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
6720: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
6730: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
6740: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
6750: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
6760: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6770: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
6780: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
6790: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
67a0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
67b0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
67c0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
67d0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
67e0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
67f0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
6800: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
6810: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
6820: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
6830: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
6840: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6850: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
6860: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6870: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
6880: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
6890: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
68a0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
68c0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
68d0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
68e0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6900: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
6910: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
6920: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
6930: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
6940: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
6950: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6960: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
6970: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
6980: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
6990: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
69a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
69b0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
69c0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
69d0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
69e0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
69f0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
6a00: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
6a10: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
6a20: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
6a30: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
6a40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
6a50: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
6a60: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
6a70: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
6a80: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
6a90: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
6aa0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
6ab0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
6ac0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
6ad0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
6ae0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
6af0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
6b00: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
6b10: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
6b20: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
6b30: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
6b40: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
6b50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6b60: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
6b70: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
6b80: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
6b90: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
6ba0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
6bb0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
6bc0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
6bd0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
6be0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
6bf0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
6c00: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
6c10: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
6c20: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
6c30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6c40: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6c50: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
6c60: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6c70: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
6c80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6c90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
6ca0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
6cb0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
6cc0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
6cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
6ce0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
6cf0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
6d00: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
6d10: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
6d20: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
6d30: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
6d50: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
6d60: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
6d70: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
6d80: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
6d90: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
6da0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
6db0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
6dc0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
6dd0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
6de0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
6df0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
6e00: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
6e10: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
6e20: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
6e30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6e40: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
6e50: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
6e60: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
6e70: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
6e80: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6e90: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
6ea0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
6eb0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
6ec0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
6ed0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
6ee0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
6ef0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
6f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
6f10: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6f20: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
6f30: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
6f40: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
6f50: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6f60: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
6f70: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
6f80: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
6f90: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
6fa0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6fb0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
6fc0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
6fd0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
6fe0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7010: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
7020: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
7030: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
7040: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
7050: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
7060: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
7070: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
7080: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7090: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
70a0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
70b0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
70c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
70d0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
70e0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
70f0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
7100: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
7110: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
7120: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7130: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7140: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7150: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
7160: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
7170: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
7180: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
7190: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
71a0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
71b0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
71c0: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
71d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
71e0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
71f0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
7200: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7210: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
7220: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7230: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7240: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7250: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
7260: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
7270: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
7280: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
7290: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
72a0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
72b0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
72c0: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
72d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
72e0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
72f0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7300: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7310: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7320: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7330: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7340: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7350: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7360: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7370: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7380: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7390: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
73a0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
73b0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
73c0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
73d0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
73e0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
73f0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7400: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7410: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7420: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7430: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7440: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7450: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7460: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7470: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7480: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7490: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
74a0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
74b0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
74c0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
74d0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
74e0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
74f0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7500: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7510: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7520: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7530: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7540: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7550: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7560: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7570: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7580: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7590: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
75a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
75b0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
75c0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
75d0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
75e0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
75f0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7600: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7610: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7620: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7630: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7700: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7720: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7730: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7740: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7750: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7760: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7770: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7780: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7790: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
77a0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
77b0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
77c0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
77d0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
77e0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
77f0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7800: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7810: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7820: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
7830: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
7840: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
7850: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
7860: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
7870: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
7880: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7890: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
78a0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
78b0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
78c0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
78d0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
78e0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
78f0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
7900: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
7910: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
7920: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
7930: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
7940: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
7950: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
7960: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
7970: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
7980: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
7990: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
79a0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
79b0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
79c0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
79d0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
79e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
79f0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
7a00: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
7a10: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
7a20: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
7a30: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
7a40: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
7a50: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
7a60: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
7a70: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
7a80: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
7a90: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
7aa0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
7ab0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
7ac0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
7ad0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
7ae0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
7af0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7b00: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
7b10: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
7b20: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
7b30: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
7b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
7b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
7b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
7b70: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
7b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
7b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
7bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
7bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
7bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
7be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
7bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
7c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
7c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
7c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
7c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
7c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
7c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
7c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
7c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
7c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
7c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
7ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
7cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
7cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
7cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
7cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
7d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
7d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
7d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
7d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
7d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
7d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
7d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
7d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
7d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
7da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
7db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
7dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
7dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
7de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
7df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
7e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
7e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
7e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
7e30: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
7e40: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
7e50: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
7e60: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
7e70: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
7e80: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
7e90: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
7ea0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
7eb0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
7ec0: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
7ed0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
7ee0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
7ef0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
7f00: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
7f10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
7f20: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
7f30: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
7f40: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
7f50: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
7f60: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
7f70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
7f80: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
7f90: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
7fa0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
7fb0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
7fc0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
7fd0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
7fe0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
7ff0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
8000: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
8010: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8020: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8030: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8040: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8050: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
8060: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
8070: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
8080: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
8090: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
80a0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
80b0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
80c0: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
80d0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
80e0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
80f0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
8100: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
8110: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
8120: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8130: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8140: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8150: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
8160: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
8170: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
8180: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
8190: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
81a0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
81b0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
81c0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
81d0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
81e0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
81f0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
8200: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
8210: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
8220: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8230: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8240: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8250: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8260: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
8270: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
8280: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
8290: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
82a0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
82b0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
82c0: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
82d0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
82e0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
82f0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8310: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8320: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8330: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8340: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8350: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8360: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8370: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8380: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8390: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
83a0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
83b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
83c0: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
83d0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
83e0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
83f0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8400: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8410: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8420: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8430: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8440: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8450: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8460: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8470: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8480: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8490: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
84a0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
84b0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
84c0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
84d0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
84e0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
84f0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8500: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8510: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8520: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8530: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8540: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8550: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8560: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8570: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8580: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8590: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
85a0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
85b0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
85c0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
85d0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
85e0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
85f0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8600: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8610: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8620: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8630: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8640: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8650: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8660: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8670: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8680: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8690: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
86a0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
86b0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
86c0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
86d0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
86e0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
86f0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8700: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8710: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8720: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8730: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8740: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8750: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8760: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8770: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8780: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8790: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
87a0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
87b0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
87c0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
87d0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
87e0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
87f0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8800: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8810: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8820: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
8830: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
8840: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
8850: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
8860: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
8870: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
8880: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
8890: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
88a0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
88b0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
88c0: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
88d0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
88e0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
88f0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
8900: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
8910: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
8920: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
8930: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
8940: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
8950: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
8960: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
8970: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8980: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
8990: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
89a0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
89b0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
89c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
89d0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
89e0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
89f0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
8a00: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
8a10: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
8a20: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
8a30: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
8a40: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
8a50: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8a70: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
8a80: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8a90: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
8aa0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
8ab0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
8ac0: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
8ad0: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
8b00: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
8b10: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
8b20: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
8b30: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
8b40: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
8b50: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
8b60: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
8b70: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
8b80: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
8b90: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
8ba0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
8bb0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
8bc0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
8bd0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
8be0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
8bf0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
8c00: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
8c10: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8c20: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
8c30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8c40: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
8c50: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
8c60: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
8c70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
8c80: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
8c90: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
8ca0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
8cb0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
8cc0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
8cd0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
8ce0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
8cf0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
8d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8d10: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
8d20: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
8d30: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
8d40: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
8d50: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
8d60: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
8d70: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
8d80: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
8d90: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
8da0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
8db0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
8dc0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8df0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
8e00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8e10: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
8e20: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
8e30: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
8e40: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
8e50: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
8e60: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
8ea0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
8eb0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
8ec0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
8ed0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
8ee0: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
8ef0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
8f00: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
8f10: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8f20: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
8f30: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
8f40: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
8f50: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
8f60: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
8f70: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
8f80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
8f90: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
8fa0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
8fb0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
8fc0: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
8fd0: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
8fe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
8ff0: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
9000: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
9010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9020: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
9030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
9040: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
9050: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
9060: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
9070: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9080: 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20  *.** A lists of 
9090: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
90a0: 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  o objects..*/.st
90b0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
90c0: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
90d0: 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  0;../*.**.** Thi
90e0: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69  s function - uni
90f0: 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69  xLogError_x(), i
9100: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
9110: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
9120: 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  .** unixLogError
9130: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ()..**.** It is 
9140: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
9150: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
9160: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   an OS function 
9170: 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65  and errno has be
9180: 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f  en.** set. It lo
9190: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
91a0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
91b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
91c0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
91d0: 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69  .** errno and, i
91e0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
91f0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
9200: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73  quivalent from s
9210: 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20  trerror() or.** 
9220: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a  strerror_r()..**
9230: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
9240: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
9250: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
9260: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
9270: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
9280: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
9290: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
92a0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
92b0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
92c0: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
92d0: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
92e0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
92f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
9300: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
9310: 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20  ** failed (e.g. 
9320: 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22  "unlink", "open"
9330: 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  ) and the associ
9340: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
9350: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
9360: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
9370: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
9380: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
9390: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
93a0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
93b0: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
93c0: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
93d0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
93e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
93f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
9400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9410: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
9420: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
9430: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
9440: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
9450: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
9460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9470: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
9480: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
9490: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
94c0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
94d0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
94e0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
94f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9500: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
9510: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9520: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
9530: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
9540: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
9550: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
9560: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
9570: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
9580: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
9590: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
95a0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
95b0: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
95c0: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
95d0: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
95e0: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
95f0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
9600: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
9610: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
9620: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
9630: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
9640: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
9650: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
9660: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
9670: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
9680: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
9690: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
96a0: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
96b0: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
96c0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
96d0: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
96e0: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
96f0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
9700: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
9710: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9720: 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55  provides the GNU
9730: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
9740: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20  rror_r() that.  
9750: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
9760: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
9770: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
9790: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
97a0: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
97b0: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
97c0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
97d0: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
97e0: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
97f0: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
9800: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9810: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
9820: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
9830: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
9840: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
9850: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
9860: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
9870: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
9880: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
9890: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
98a0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
98b0: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
98c0: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
98d0: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
98e0: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
98f0: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
9900: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
9910: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
9920: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
9930: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
9940: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
9950: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
9960: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
9970: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
9980: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
9990: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
99a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
99b0: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
99c0: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
99d0: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
99e0: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
99f0: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
9a00: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
9a10: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
9a20: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
9a30: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
9a40: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
9a50: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
9a60: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
9a70: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
9a80: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
9a90: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
9aa0: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
9ab0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9ac0: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
9ad0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
9ae0: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
9af0: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
9b00: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
9b10: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
9b20: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
9b30: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
9b40: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
9b50: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
9b60: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
9b70: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
9b80: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
9b90: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
9ba0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
9bb0: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
9bc0: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
9bd0: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
9be0: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
9bf0: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
9c00: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
9c10: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
9c20: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
9c30: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
9c40: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
9c50: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
9c60: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
9c70: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
9c80: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
9c90: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
9ca0: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
9cb0: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
9cc0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
9cd0: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
9ce0: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
9cf0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
9d00: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
9d10: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
9d20: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
9d30: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
9d40: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
9d50: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
9d60: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
9d70: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
9d80: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
9d90: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
9da0: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
9db0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9dc0: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
9dd0: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
9e00: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
9e10: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
9e20: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9e30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9e40: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9e50: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9e60: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9e70: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9e80: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9e90: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9ea0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9eb0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ec0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9ed0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9ee0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9ef0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9f00: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9f10: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9f20: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
9f30: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
9f40: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
9f50: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
9f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
9f70: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
9f80: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
9f90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
9fa0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
9fb0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
9fc0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
9fd0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
9fe0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
9ff0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a000: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a010: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a020: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a030: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a040: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a050: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a060: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a070: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a080: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a090: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a0a0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a0b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a0c0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a0d0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a0e0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a0f0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a100: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a110: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a120: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a130: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a140: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a150: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a160: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a170: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a180: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a190: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a1a0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a1b0: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a1c0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a1d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a1e0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a1f0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a200: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a210: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a220: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a230: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a250: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a260: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a270: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a280: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a290: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a2a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a2b0: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a2d0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a2e0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a2f0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a300: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a310: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a320: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a330: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a340: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a350: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a360: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a370: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a380: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a390: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a3a0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a3b0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a3c0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a3d0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a3e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a3f0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a400: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a410: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a420: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a430: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a440: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a450: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a460: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a470: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a480: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a490: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a4a0: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a4b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a4c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a4d0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a4e0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a510: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a520: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a550: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a560: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a570: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a580: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a590: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a5a0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a5b0: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a5c0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a5d0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a5e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a5f0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a600: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a610: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a620: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a630: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a640: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a650: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a660: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a670: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a680: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a690: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a6a0: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a6b0: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a6c0: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a6d0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a6e0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a6f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a700: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
a710: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
a720: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
a730: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
a740: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
a750: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
a760: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
a770: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
a780: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
a790: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
a7a0: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
a7b0: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
a7c0: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
a7d0: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
a7e0: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
a7f0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
a800: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
a810: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
a820: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
a830: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
a840: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
a850: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
a860: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
a870: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
a880: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
a890: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
a8a0: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
a8b0: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
a8c0: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
a8d0: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
a8e0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
a8f0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
a900: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
a910: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
a920: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
a930: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
a940: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
a950: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
a960: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
a970: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
a980: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
a990: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
a9a0: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
a9b0: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
a9c0: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
a9d0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
a9e0: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
a9f0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
aa00: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
aa10: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
aa20: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
aa30: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
aa40: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
aa50: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
aa60: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
aa70: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
aa80: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
aa90: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
aaa0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
aab0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
aac0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aad0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
aae0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
aaf0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
ab00: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
ab10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ab20: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ab30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ab40: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
ab50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
ab60: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
ab70: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ab80: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
ab90: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
aba0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
abb0: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
abc0: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
abd0: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
abe0: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
abf0: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
ac00: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
ac10: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
ac20: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
ac30: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
ac40: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ac50: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
ac60: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
ac70: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
ac80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
ac90: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
aca0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
acb0: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
acc0: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
acd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ace0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
acf0: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
ad00: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
ad10: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
ad20: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
ad30: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
ad40: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
ad50: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
ad60: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
ad70: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
ad80: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
ad90: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
ada0: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
adb0: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
adc0: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
add0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
ade0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
adf0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
ae00: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
ae10: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
ae20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
ae30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ae40: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
ae50: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
ae60: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
ae70: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
ae80: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ae90: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
aea0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
aeb0: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
aec0: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
aed0: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
aee0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
aef0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
af00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
af10: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
af20: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
af30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
af40: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
af50: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
af60: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
af70: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
af80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
af90: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
afa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
afb0: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
afc0: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
afd0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
afe0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
aff0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
b000: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
b010: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
b020: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
b030: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
b040: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
b050: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
b060: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
b070: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
b080: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
b090: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
b0a0: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
b0b0: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
b0c0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
b0d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
b0e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
b0f0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
b100: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
b110: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
b120: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
b130: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
b140: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
b150: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
b160: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
b170: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
b180: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
b190: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
b1a0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b1b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
b1c0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
b1d0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
b1e0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
b1f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b200: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
b210: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b220: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
b230: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
b240: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b250: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
b260: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
b270: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b280: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
b290: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
b2a0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  NLCK ){.      re
b2b0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
b2c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
b2d0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
b2e0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
b2f0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
b300: 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  %d %d (unix)\n",
b310: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
b320: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
b330: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
b340: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
b350: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
b360: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
b370: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
b380: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
b390: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
b3a0: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
b3b0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
b3c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
b3d0: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
b3e0: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
b3f0: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
b400: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
b410: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
b420: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
b430: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
b440: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
b450: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
b460: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
b470: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
b480: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
b490: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
b4a0: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
b4b0: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
b4c0: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
b4d0: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
b4e0: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
b4f0: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
b500: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
b510: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
b520: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
b530: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
b540: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
b550: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
b560: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
b570: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
b580: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
b590: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b5a0: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
b5b0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
b5c0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
b5d0: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
b5e0: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
b5f0: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
b600: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
b610: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
b620: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
b630: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
b640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
b650: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
b660: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
b670: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
b680: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
b690: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
b6a0: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
b6b0: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
b6c0: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
b6d0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
b6e0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
b6f0: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
b700: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
b710: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
b720: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
b730: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
b740: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
b750: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
b760: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
b770: 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74   if( ((pFile->ct
b780: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
b790: 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70  LE_EXCL)!=0 || p
b7a0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b7b0: 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69  ock).   && ((pFi
b7c0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
b7d0: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
b7e0: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ==0).  ){.    if
b7f0: 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
b800: 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
b810: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
b820: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
b830: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
b840: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f  k==0 );.      lo
b850: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b860: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
b870: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
b880: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
b890: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
b8a0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
b8b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b8c0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63  _WRLCK;.      rc
b8d0: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
b8e0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b8f0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
b900: 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63  rc<0 ) return rc
b910: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
b920: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31  bProcessLock = 1
b930: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
b940: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nLock++;.    }el
b950: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
b960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b970: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
b980: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b990: 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d  TLK, pLock);.  }
b9a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b9b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
b9c0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
b9d0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
b9e0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
b9f0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
ba00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
ba10: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
ba20: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
ba30: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
ba40: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
ba50: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
ba60: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
ba70: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
ba80: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
ba90: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
baa0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
bab0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
bac0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
bad0: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
bae0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
baf0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
bb00: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
bb10: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
bb20: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
bb30: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
bb40: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
bb50: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
bb60: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
bb70: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
bb80: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
bb90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
bba0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
bbb0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
bbc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
bbd0: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
bbe0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
bbf0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
bc00: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
bc10: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
bc20: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
bc30: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
bc40: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
bc50: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
bc60: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
bc70: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
bc80: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
bc90: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
bca0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
bcb0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
bcc0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
bcf0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
bd00: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
bd10: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
bd20: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
bd30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
bd40: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
bd50: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
bd60: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
bd70: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
bd80: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
bd90: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
bda0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
bdb0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
bdc0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
bdd0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
bde0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
bdf0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
be00: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
be10: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
be20: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
be30: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
be40: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
be50: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
be60: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
be70: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
be80: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
be90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
bea0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
beb0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
bec0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
bed0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
bee0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
bef0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
bf00: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
bf10: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
bf20: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
bf30: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
bf40: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
bf50: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
bf60: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
bf70: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
bf80: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
bf90: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
bfa0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
bfb0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
bfc0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
bfd0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
bfe0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
bff0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
c000: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
c010: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
c020: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
c030: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
c040: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
c050: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
c060: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
c070: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
c080: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
c090: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
c0a0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c0b0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
c0c0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
c0d0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c0e0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
c0f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
c100: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
c110: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
c120: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
c130: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
c140: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
c150: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
c160: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
c170: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
c180: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
c190: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
c1a0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
c1b0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
c1c0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
c1d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
c1e0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
c1f0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
c200: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
c210: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
c220: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
c230: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
c240: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
c250: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
c260: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
c270: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
c280: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
c290: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
c2a0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
c2b0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
c2c0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
c2d0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
c2e0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
c2f0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
c300: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
c310: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
c320: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
c330: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
c340: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
c350: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
c360: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
c370: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c380: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
c390: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
c3a0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
c3b0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
c3c0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
c3d0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
c3e0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
c3f0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
c400: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
c410: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
c420: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
c430: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
c440: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
c450: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
c460: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c470: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
c480: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
c490: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
c4a0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
c4b0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
c4c0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
c4d0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
c4e0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
c4f0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
c500: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
c510: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
c520: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
c530: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
c540: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
c550: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c560: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c570: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
c580: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c590: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
c5a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
c5b0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
c5c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
c5d0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
c5e0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
c5f0: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
c600: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
c610: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61  File->h,.      a
c620: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
c630: 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
c640: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
c650: 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  k),.      azFile
c660: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  Lock(pFile->pIno
c670: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
c680: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
c690: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
c6a0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
c6b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
c6c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
c6d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
c6e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
c6f0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
c700: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
c710: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
c720: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
c730: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
c740: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
c750: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
c760: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
c770: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
c780: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
c790: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
c7a0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
c7b0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
c7c0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
c7d0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
c7e0: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
c7f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c800: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
c810: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
c820: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
c830: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
c840: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
c850: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
c860: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
c870: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
c880: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
c890: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
c8a0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
c8b0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
c8c0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
c8d0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
c8e0: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
c8f0: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
c900: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
c910: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c920: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
c930: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
c940: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
c950: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
c960: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
c970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
c980: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
c990: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
c9a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c9b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
c9c0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
c9d0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
c9e0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
c9f0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
ca00: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
ca10: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ca20: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ca30: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
ca40: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
ca50: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
ca60: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
ca70: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
ca80: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
ca90: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
caa0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
cab0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
cac0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
cad0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
cae0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
caf0: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
cb00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
cb10: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
cb20: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
cb30: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
cb40: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
cb50: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
cb60: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
cb70: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
cb80: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
cb90: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
cba0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
cbb0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
cbc0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
cbd0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
cbe0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
cbf0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
cc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cc10: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
cc20: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cc30: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
cc40: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
cc50: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
cc60: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
cc70: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cc80: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
cc90: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
cca0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
ccb0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ccc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
ccd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
cce0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
ccf0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
cd00: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
cd10: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cd20: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
cd30: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
cd40: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
cd50: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
cd60: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
cd70: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
cd80: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
cd90: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
cda0: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
cdb0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
cdc0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
cdd0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
cde0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
cdf0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
ce00: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
ce10: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
ce20: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ce30: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
ce40: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
ce50: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
ce60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
ce70: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
ce80: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
ce90: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
cea0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
ceb0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
cec0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
ced0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
cee0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
cef0: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
cf00: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
cf10: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
cf20: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
cf30: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
cf40: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
cf50: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
cf60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
cf70: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
cf80: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
cf90: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
cfa0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
cfb0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
cfc0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
cfd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
cfe0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
cff0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
d000: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
d010: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
d020: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
d030: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
d040: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
d050: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
d060: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d070: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
d080: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
d090: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
d0a0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d0b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
d0c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
d0d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
d0e0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
d0f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
d100: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d110: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
d120: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d130: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
d140: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d150: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d160: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d170: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d180: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d190: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d1a0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d1b0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
d1c0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
d1d0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
d1e0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
d1f0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
d200: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
d210: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
d220: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
d230: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
d240: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d250: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
d260: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
d270: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
d280: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
d290: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
d2a0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
d2b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d2c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
d2d0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
d2e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
d2f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
d300: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
d310: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d320: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d340: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d360: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d370: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
d380: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
d390: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
d3a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
d3c0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
d3d0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
d3e0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
d3f0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
d400: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
d410: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
d420: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
d430: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
d440: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
d450: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
d460: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
d470: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
d480: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
d490: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
d4a0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
d4b0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
d4c0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
d4d0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
d4e0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
d4f0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
d500: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
d510: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
d520: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
d530: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
d540: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
d550: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d560: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
d570: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
d580: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
d590: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
d5a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
d5b0: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
d5c0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
d5d0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
d5e0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
d5f0: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
d600: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
d610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
d620: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
d630: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
d640: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
d650: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
d660: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
d670: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d680: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d690: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d6a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d6b0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d6c0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d6d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d6e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d6f0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
d700: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d710: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d720: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d730: 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
d740: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
d750: 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
d760: 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
d770: 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
d780: 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
d790: 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
d7a0: 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
d7b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
d7c0: 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
d7d0: 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
d7e0: 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
d7f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
d800: 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
d810: 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
d820: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
d830: 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
d840: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d850: 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
d860: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
d870: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
d880: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
d890: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
d8a0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
d8b0: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
d8c0: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
d8d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
d8e0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
d8f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
d900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d910: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
d920: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
d930: 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
d940: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
d950: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
d960: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d970: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
d980: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
d990: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
d9a0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
d9b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
d9c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
d9d0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
d9e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
d9f0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
da00: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
da10: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
da20: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
da30: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
da40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
da50: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
da60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
da70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
da80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
da90: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
daa0: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
dab0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
dac0: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
dad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dae0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
daf0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
db00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
db10: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
db20: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
db30: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
db40: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
db50: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
db60: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
db70: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
db80: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
db90: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
dba0: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
dbb0: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
dbc0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
dbd0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
dbe0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
dbf0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
dc00: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
dc10: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
dc20: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
dc30: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
dc40: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
dc50: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
dc60: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
dc70: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
dc80: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
dc90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
dca0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
dcb0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dcc0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
dcd0: 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
dce0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
dcf0: 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
dd00: 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
dd10: 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
dd20: 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
dd30: 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
dd40: 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
dd50: 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
dd60: 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
dd70: 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
dd80: 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
dd90: 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
dda0: 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
ddb0: 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
ddc0: 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
ddd0: 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
dde0: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
ddf0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
de00: 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
de10: 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
de20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
de30: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
de40: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
de50: 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e  ileLock, int han
de60: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
de70: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
de80: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
de90: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
dea0: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
deb0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
dec0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ded0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
dee0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
def0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
df00: 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
df10: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
df20: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
df30: 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70  ileLock,.      p
df40: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
df50: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
df60: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
df70: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
df80: 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28  d,.      getpid(
df90: 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
dfa0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
dfb0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
dfc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
dfd0: 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
dfe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dff0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
e000: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
e010: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
e020: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
e030: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
e050: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
e060: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
e070: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
e080: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
e090: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
e0a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
e0b0: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
e0c0: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
e0d0: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
e0e0: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
e0f0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
e100: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
e110: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
e120: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
e130: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
e140: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
e150: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
e160: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
e170: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
e180: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
e190: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
e1a0: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
e1b0: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
e1c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
e1d0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
e1e0: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
e1f0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
e200: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
e210: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
e220: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
e230: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
e240: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
e250: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
e260: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
e270: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
e280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
e290: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
e2a0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
e2b0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
e2c0: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
e2d0: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
e2e0: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
e2f0: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
e300: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
e310: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
e320: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
e330: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
e340: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
e350: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
e360: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
e370: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
e380: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
e390: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
e3a0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
e3b0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
e3c0: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
e3d0: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
e3e0: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
e3f0: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
e400: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
e410: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
e420: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
e430: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
e440: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
e450: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
e460: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
e470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
e480: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
e490: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
e4a0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
e4b0: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
e4c0: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
e4d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
e4e0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
e4f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
e500: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
e510: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
e520: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
e530: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
e540: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
e550: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
e560: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
e570: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
e580: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
e590: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
e5a0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
e5b0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
e5c0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e5d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
e5e0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
e5f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
e600: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
e610: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
e620: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
e630: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e640: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
e650: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
e660: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e670: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e680: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e690: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
e6a0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e6b0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e6c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e6d0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e6e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e6f0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e700: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e710: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e720: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
e730: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e740: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e750: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e760: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e770: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
e780: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
e790: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
e7a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e7b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
e7d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e7e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e7f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
e800: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
e810: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
e820: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
e830: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e840: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e850: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e860: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e870: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e880: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e890: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e8a0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e8b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
e8c0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e8d0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e8e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e8f0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e900: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
e910: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e920: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
e930: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e940: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e950: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e960: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e970: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e980: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e990: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e9a0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
e9b0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
e9c0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
e9d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e9e0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e9f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ea00: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ea10: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ea20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
ea30: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
ea40: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
ea50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
ea60: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
ea70: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
ea80: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
ea90: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
eaa0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
eab0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
eac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ead0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
eae0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
eaf0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
eb00: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
eb10: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
eb20: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
eb30: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
eb40: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
eb50: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
eb60: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
eb70: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
eb80: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
eb90: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
eba0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
ebb0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
ebc0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
ebd0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
ebe0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
ebf0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
ec00: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
ec10: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
ec20: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
ec30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ec40: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
ec50: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
ec60: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
ec70: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
ec80: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
ec90: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
eca0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
ecb0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
ecc0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
ecd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ece0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
ecf0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ed00: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
ed10: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ed20: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ed40: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
ed50: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ed60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ed70: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
ed80: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ed90: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
eda0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
edb0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
edc0: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
edd0: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
ede0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
edf0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ee00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
ee10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
ee20: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
ee30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
ee40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ee50: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
ee60: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ee70: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
ee80: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
ee90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
eea0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
eeb0: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
eec0: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
eed0: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
eee0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
eef0: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
ef00: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
ef10: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
ef20: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
ef30: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
ef40: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
ef50: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
ef60: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
ef70: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
ef80: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
ef90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
efa0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
efb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
efc0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
efd0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
efe0: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
eff0: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
f000: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f010: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
f020: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f030: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f040: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
f050: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f060: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f070: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
f080: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
f090: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f  no;.        pIno
f0a0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f0b0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
f0c0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f0d0: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
f0e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f0f0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f100: 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
f110: 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
f120: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
f130: 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
f140: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
f150: 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
f160: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
f170: 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
f180: 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
f190: 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
f1a0: 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
f1b0: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
f1c0: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
f1d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
f1e0: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
f1f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
f200: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   ){.      closeP
f210: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
f220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
f230: 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
f240: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
f250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f260: 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
f270: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
f280: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f290: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
f2a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
f2b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
f2c0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
f2d0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
f2e0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
f2f0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
f300: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
f310: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
f320: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
f330: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
f340: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
f350: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
f360: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
f370: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
f380: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
f3a0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
f3b0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
f3c0: 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
f3d0: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
f3e0: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a   eFileLock, 0);.
f3f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  }..static int un
f400: 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
f410: 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
f420: 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  te);.static void
f430: 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
f440: 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 0a  nixFile *pFd);..
f450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f460: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
f470: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
f480: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
f490: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
f4a0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
f4b0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
f4c0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
f4d0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
f4e0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
f4f0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
f500: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
f510: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
f520: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
f530: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
f540: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
f550: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
f560: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
f570: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
f580: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
f590: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
f5a0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
f5b0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
f5c0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
f5d0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
f5e0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
f5f0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
f600: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
f610: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f620: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f630: 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
f640: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69  File);.  if( pFi
f650: 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
f660: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
f670: 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
f680: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
f690: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a  le->h = -1;.  }.
f6a0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
f6b0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
f6c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
f6d0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
f6e0: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
f6f0: 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
f700: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
f710: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
f720: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
f730: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
f740: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
f750: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
f760: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
f770: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
f780: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
f790: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
f7a0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
f7b0: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
f7c0: 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
f7d0: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
f7e0: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
f7f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f800: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
f810: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
f820: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
f830: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
f840: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f850: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
f860: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f870: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
f880: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
f890: 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
f8a0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
f8b0: 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
f8c0: 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
f8d0: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
f8e0: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
f8f0: 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
f900: 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
f910: 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
f920: 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
f930: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
f940: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
f950: 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
f960: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
f970: 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
f980: 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
f990: 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
f9a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
f9b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
f9c0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
f9d0: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
f9e0: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
f9f0: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
fa00: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
fa10: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
fa20: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
fa30: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
fa40: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
fa50: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
fa60: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
fa70: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
fa80: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
fa90: 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
faa0: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
fab0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
fac0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
fad0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
fae0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
faf0: 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
fb00: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
fb10: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
fb20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fb30: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
fb40: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
fb50: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
fb60: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
fb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb80: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
fb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbd0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
fbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc20: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
fc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc40: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc70: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
fc80: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
fc90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
fca0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
fcb0: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
fcc0: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
fcd0: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
fce0: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
fcf0: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
fd00: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
fd10: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
fd20: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
fd30: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
fd40: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
fd50: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
fd60: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
fd70: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
fd80: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
fd90: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
fda0: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
fdb0: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
fdc0: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
fdd0: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
fde0: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
fdf0: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
fe00: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
fe10: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
fe20: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
fe30: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
fe40: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fe50: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
fe60: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
fe70: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
fe80: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
fe90: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
fea0: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
feb0: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
fec0: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
fed0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
fee0: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
fef0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
ff00: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
ff10: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
ff20: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
ff30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
ff40: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
ff50: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
ff60: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ff70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
ff80: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
ff90: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
ffa0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
ffb0: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
ffc0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
ffd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
ffe0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
fff0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
10000 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
10010 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
10020 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
10030 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
10040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10050 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
10060 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
10070 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
10080 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
10090 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
100a0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
100b0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
100c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
100d0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
100e0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
100f0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
10100 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10110 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
10120 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10130 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
10140 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
10150 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
10160 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
10170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10180 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
101e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10220 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
10240 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
10250 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10270 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
10280 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
10290 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
102a0 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
102b0 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
102c0 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c  k.** files (real
102d0 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29 20  ly a directory) 
102e0 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
102f0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
10300 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a  e.  This works.*
10310 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20  * on just about 
10320 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
10330 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
10340 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
10350 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
10360 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
10370 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
10380 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
10390 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
103a0 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
103b0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
103c0 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
103d0 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
103e0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
103f0 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
10400 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
10410 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
10420 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
10430 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
10440 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
10450 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
10460 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
10470 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
10480 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
10490 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
104a0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
104b0 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
104c0 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
104d0 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
104e0 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
104f0 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
10500 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62 64   creating a subd
10510 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20  irectory in the 
10520 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
10530 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
10540 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73  e and with the s
10550 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74  ame name but wit
10560 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65  h a ".lock" exte
10570 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20  nsion added..** 
10580 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  The existance of
10590 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72   a lock director
105a0 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43  y implies an EXC
105b0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c  LUSIVE lock.  Al
105c0 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20  l other.** lock 
105d0 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52  types (SHARED, R
105e0 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47  ESERVED, PENDING
105f0 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74  ) are mapped int
10600 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a  o EXCLUSIVE..*/.
10610 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ./*.** The file 
10620 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20  suffix added to 
10630 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69  the data base fi
10640 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20  lename in order 
10650 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a  to create the.**
10660 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e   lock directory.
10670 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c  .*/.#define DOTL
10680 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63  OCK_SUFFIX ".loc
10690 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  k"../*.** This r
106a0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
106b0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
106c0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
106d0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
106e0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
106f0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
10700 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
10710 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
10720 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
10730 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
10740 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
10750 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
10760 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
10770 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
10780 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
10790 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
107a0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
107b0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
107c0 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20  *.** In dotfile 
107d0 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20  locking, either 
107e0 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72  a lock exists or
107f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53   it does not.  S
10800 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72  o in this.** var
10810 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52  iation of CheckR
10820 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a  eservedLock(), *
10830 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
10840 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f  o true if any lo
10850 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e  ck.** is held on
10860 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61   the file and fa
10870 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  lse if the file 
10880 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a  is unlocked..*/.
10890 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
108a0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
108b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
108c0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
108d0 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
108e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
108f0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
10900 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10910 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10920 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
10930 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10940 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10950 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
10960 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
10970 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
10980 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
10990 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
109a0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
109b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
109c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
109d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  D_LOCK ){.    /*
109e0 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e   Either this con
109f0 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20  nection or some 
10a00 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
10a10 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
10a20 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64  cess.    ** hold
10a30 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  s a lock on the 
10a40 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  file.  No need t
10a50 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e  o check further.
10a60 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64   */.    reserved
10a70 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
10a80 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69     /* The lock i
10a90 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e  s held if and on
10aa0 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69  ly if the lockfi
10ab0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
10ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
10ad0 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20  ckFile = (const 
10ae0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
10af0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
10b00 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63   reserved = osAc
10b10 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  cess(zLockFile, 
10b20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54  0)==0;.  }.  OST
10b30 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
10b40 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f  OCK %d %d %d (do
10b50 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
10b60 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
10b70 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  d));.  *pResOut 
10b80 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
10b90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10ba0 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
10bb0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
10bc0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
10bd0 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
10be0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
10bf0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
10c00 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
10c10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
10c20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
10c30 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
10c40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
10c50 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
10c60 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
10c70 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
10c80 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
10c90 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
10ca0 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
10cb0 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
10cc0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
10cd0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
10ce0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
10cf0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
10d00 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
10d10 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
10d20 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
10d30 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
10d40 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
10d50 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
10d60 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
10d70 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
10d80 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
10d90 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
10da0 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
10db0 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
10dc0 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
10dd0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
10de0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
10df0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
10e00 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
10e10 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
10e20 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10e30 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
10e40 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
10e50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10e60 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
10e70 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
10e80 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
10e90 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
10ea0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
10eb0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a  cking level..**.
10ec0 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20  ** With dotfile 
10ed0 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c  locking, we real
10ee0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
10ef0 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55  state (4): EXCLU
10f00 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20  SIVE..** But we 
10f10 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20  track the other 
10f20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69  locking levels i
10f30 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74  nternally..*/.st
10f40 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10f50 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
10f60 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
10f70 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
10f80 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10f90 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
10fa0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
10fb0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
10fc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
10fd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10fe0 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
10ff0 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
11000 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
11010 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
11020 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
11030 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
11040 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
11050 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
11060 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
11070 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11080 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
11090 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
110a0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
110b0 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c  eLock;.    /* Al
110c0 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
110d0 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
110e0 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66   old file */.#if
110f0 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20  def HAVE_UTIME. 
11100 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69     utime(zLockFi
11110 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65  le, NULL);.#else
11120 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
11130 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11140 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
11150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11160 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
11170 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
11180 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28  .  rc = osMkdir(
11190 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29  zLockFile, 0777)
111a0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
111b0 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
111c0 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
111d0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
111e0 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
111f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
11200 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
11210 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
11220 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
11230 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11250 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11260 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11270 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
11280 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11290 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
112a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
112b0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
112c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
112d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
112e0 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
112f0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
11300 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11310 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11320 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11340 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11350 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11360 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11370 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11380 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11390 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
113a0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
113b0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
113c0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
113d0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
113e0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
113f0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
11400 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11410 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11420 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11430 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
11440 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
11450 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
11460 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
11470 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
11480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11490 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
114a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
114b0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
114c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
114d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
114e0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
114f0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11500 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11510 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
11520 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11530 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
11540 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
11550 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
11560 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11570 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
11580 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11590 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
115a0 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
115b0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
115c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
115d0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
115e0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
115f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
11600 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
11630 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
11640 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
11650 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
11660 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
11670 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
11680 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
11690 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
116a0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
116b0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
116c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
116d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
116e0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
116f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11700 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11710 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
11720 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
11730 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
11740 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
11750 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
11760 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
11770 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
11780 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ;.  if( rc<0 && 
11790 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29  errno==ENOTDIR )
117a0 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a   rc = osUnlink(z
117b0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
117c0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
117d0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
117e0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
117f0 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
11800 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
11810 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11820 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
11830 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11840 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
11850 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11860 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11870 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
11880 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
11890 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
118a0 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
118b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
118c0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
118d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
118e0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
118f0 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
11900 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
11910 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
11920 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11930 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
11940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
11950 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
11960 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11970 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
11980 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
11990 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
119a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
119b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
119c0 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  xt);.    rc = cl
119d0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
119e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
119f0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
11a00 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
11a10 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
11a20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a40 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a90 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
11aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ae0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11b00 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
11b10 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
11b40 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
11b50 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
11b60 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
11b70 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
11b80 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
11b90 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
11ba0 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
11bb0 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
11bc0 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
11bd0 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
11be0 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
11bf0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
11c00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
11c10 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
11c20 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
11c30 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
11c40 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
11c50 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
11c60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
11c70 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
11c80 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
11c90 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
11ca0 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
11cb0 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
11cc0 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
11cd0 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
11ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
11cf0 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
11d00 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
11d10 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
11d20 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
11d30 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
11d40 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
11d50 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
11d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
11d70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
11d80 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
11d90 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f  ./*.** Retry flo
11da0 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ck() calls that 
11db0 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a  fail with EINTR.
11dc0 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a  */.#ifdef EINTR.
11dd0 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
11de0 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  t_flock(int fd, 
11df0 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72  int op){.  int r
11e00 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c  c;.  do{ rc = fl
11e10 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69  ock(fd,op); }whi
11e20 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
11e30 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
11e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
11e50 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74  .# define robust
11e60 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63  _flock(a,b) floc
11e70 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20  k(a,b).#endif.  
11e80 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
11e90 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
11ea0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
11eb0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
11ec0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
11ed0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
11ee0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
11ef0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
11f00 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
11f10 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
11f20 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
11f30 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
11f40 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
11f50 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
11f60 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
11f70 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
11f80 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
11f90 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11fa0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
11fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11fc0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11fd0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11fe0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11ff0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
12000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12010 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12020 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12030 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12040 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
12050 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12070 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
12080 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
12090 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
120a0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
120b0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
120c0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
120d0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
120e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
120f0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12100 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12110 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
12120 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
12130 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
12140 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
12150 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
12160 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
12170 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
12180 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
12190 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
121a0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
121b0 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
121c0 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20  f( !lrc ){.     
121d0 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b   /* got the lock
121e0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20  , unlock it */. 
121f0 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73       lrc = robus
12200 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
12210 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
12220 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
12230 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
12240 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12250 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
12260 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
12270 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63  r */.        lrc
12280 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12290 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20  UNLOCK; .       
122a0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
122b0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
122c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
122d0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
122e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
122f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
12300 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
12310 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
12320 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12330 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
12340 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
12350 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
12360 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
12370 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
12380 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12390 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
123a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
123b0 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
123c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
123d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
123e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
123f0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
12400 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
12410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
12420 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
12430 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
12440 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
12450 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
12460 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
12470 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12480 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
12490 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
124a0 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
124b0 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
124c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
124d0 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
124e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
124f0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
12500 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
12510 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
12520 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
12530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12540 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12550 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12560 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
12570 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
12580 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
12590 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
125a0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
125b0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
125c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
125d0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
125e0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
125f0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
12600 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
12610 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
12620 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
12630 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
12640 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
12650 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
12660 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
12670 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
12680 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
12690 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
126a0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
126b0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
126c0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
126d0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
126e0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
126f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
12700 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
12710 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
12720 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
12730 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
12740 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
12750 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
12760 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12770 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
12780 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
12790 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
127a0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
127b0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
127c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
127d0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
127e0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f  LUSIVE.**.** flo
127f0 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ck() only really
12800 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
12810 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
12820 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
12830 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
12840 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
12850 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
12860 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
12870 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
12880 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
12890 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
128a0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
128b0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
128c0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
128d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
128e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
128f0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
12900 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
12910 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
12920 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
12930 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
12940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12950 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
12960 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12970 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
12980 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12990 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
129a0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
129b0 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
129c0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
129d0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
129e0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
129f0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
12a00 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
12a10 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
12a20 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
12a30 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
12a40 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
12a50 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
12a60 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
12a70 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
12a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12a90 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
12aa0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
12ab0 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73  /.  .  if (robus
12ac0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
12ad0 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
12ae0 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
12af0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12b00 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
12b10 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
12b20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
12b30 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12b40 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12b50 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
12b60 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
12b70 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12b80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12b90 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12ba0 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
12bb0 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
12bc0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
12bd0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
12be0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12bf0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12c00 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
12c10 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
12c20 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
12c30 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
12c40 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
12c50 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
12c60 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
12c70 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66   "failed"));.#if
12c80 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
12c90 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12ca0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
12cb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
12cc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
12cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12ce0 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
12cf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
12d00 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
12d10 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
12d20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
12d30 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
12d40 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
12d50 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
12d60 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
12d70 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
12d80 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
12d90 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
12da0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
12db0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
12dc0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
12dd0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
12de0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
12df0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12e00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
12e10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12e20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
12e30 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
12e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12e50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
12e60 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12e70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12e80 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
12e90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
12ea0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
12eb0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
12ec0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
12ed0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
12ee0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
12ef0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
12f00 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
12f10 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
12f20 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
12f30 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
12f40 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
12f50 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12f60 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
12f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12f80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
12f90 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
12fa0 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
12fb0 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
12fc0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
12fd0 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
12fe0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
12ff0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13000 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13010 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
13020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13030 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
13040 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
13050 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if( robust_flock
13060 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13070 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51  UN) ){.#ifdef SQ
13080 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13090 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
130a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130b0 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
130c0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
130d0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
130e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
130f0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
13100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
13110 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13120 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
13130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13140 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
13150 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
13160 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
13170 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13180 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
13190 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
131a0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
131b0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
131c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d  _LOCK);.    rc =
131d0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
131e0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
131f0 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
13200 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
13210 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
13220 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
13230 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13240 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
13250 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
13260 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
132d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
132e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13320 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13330 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13340 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
13350 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13370 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
13380 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
13390 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
133a0 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
133b0 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
133c0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
133d0 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
133e0 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
133f0 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
13400 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
13410 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
13420 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
13430 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
13440 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13450 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
13460 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
13470 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
13480 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
13490 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
134a0 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
134b0 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
134c0 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
134d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
134e0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
134f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
13500 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
13510 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
13520 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
13530 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
13540 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
13550 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
13560 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
13570 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
13580 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
13590 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
135a0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
135b0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
135c0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
135d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
135e0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
135f0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13600 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t semCheckReserv
13610 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
13620 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
13630 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
13640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13650 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
13660 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
13670 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13680 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
13690 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
136a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
136b0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
136c0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
136d0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
136e0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
136f0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13700 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13710 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13720 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
13730 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13740 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13750 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
13760 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
13770 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
13780 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
13790 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
137a0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
137b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
137c0 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
137d0 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
137e0 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
137f0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
13800 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
13810 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
13820 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
13830 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
13840 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
13850 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
13860 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
13870 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
13880 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
13890 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
138a0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
138b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
138c0 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
138d0 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
138e0 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
138f0 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
13900 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
13910 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
13920 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13930 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13940 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
13950 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
13960 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
13970 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
13980 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
13990 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
139a0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
139b0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
139c0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
139d0 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
139e0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
139f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13a00 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
13a10 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
13a20 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
13a30 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
13a40 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
13a50 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
13a60 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
13a70 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
13a80 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
13a90 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
13aa0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
13ab0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
13ac0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
13ad0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
13ae0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
13af0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
13b00 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
13b10 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
13b20 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
13b30 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
13b40 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
13b50 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
13b60 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
13b70 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
13b80 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
13b90 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
13ba0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
13bb0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
13bc0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
13bd0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
13be0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
13bf0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
13c00 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
13c10 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
13c20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
13c30 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
13c40 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13c50 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13c60 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13c70 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
13c80 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13c90 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
13ca0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13cb0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
13cc0 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
13cd0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
13ce0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
13cf0 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
13d00 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
13d10 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
13d20 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
13d30 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
13d40 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
13d50 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
13d60 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
13d70 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
13d80 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
13d90 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
13da0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13db0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
13dc0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
13dd0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
13de0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
13df0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
13e00 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
13e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13e20 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
13e30 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13e40 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
13e50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13e60 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
13e70 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
13e80 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
13e90 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
13ea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13eb0 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
13ec0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
13ed0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
13ee0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
13ef0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
13f00 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
13f10 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
13f20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
13f30 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
13f40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13f50 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13f70 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
13f80 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
13f90 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
13fa0 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
13fb0 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
13fc0 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
13fd0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
13fe0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
13ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14000 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
14010 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
14020 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
14030 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
14040 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
14050 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14060 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
14070 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
14080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14090 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
140a0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
140b0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
140c0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
140d0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
140e0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
140f0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
14100 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
14110 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
14120 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
14130 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
14140 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
14150 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
14160 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
14170 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14180 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
14190 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c  nt semUnlock(sql
141a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
141b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
141c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
141d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
141e0 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
141f0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
14200 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
14210 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
14220 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
14230 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
14240 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
14250 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
14260 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
14270 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
14280 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14290 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
142a0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
142b0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
142c0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
142d0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
142e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
142f0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
14300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14320 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
14330 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
14340 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
14350 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
14360 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
14370 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
14380 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14390 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
143a0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
143b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
143c0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
143d0 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
143e0 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
143f0 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
14400 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
14410 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
14420 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14430 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
14440 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
14450 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
14460 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
14470 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
14480 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14490 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
144a0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
144b0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
144c0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
144d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
144e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
144f0 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
14500 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
14510 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
14520 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
14530 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
14540 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14550 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
14560 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
14570 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
14580 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
14590 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
145a0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
145b0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
145c0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
145d0 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
145e0 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
145f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14600 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
14610 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
14620 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
14630 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
14640 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
14650 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
14670 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
14680 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
14690 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14760 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
14770 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
147a0 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
147b0 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
147c0 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
147d0 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
147e0 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
147f0 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
14800 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
14810 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
14820 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
14830 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
14840 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
14850 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
14860 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
14870 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
14880 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
14890 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
148a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
148b0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
148c0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
148d0 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
148e0 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c  ntains all afp l
148f0 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61  ock specific sta
14900 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  te.*/.typedef st
14910 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
14920 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
14930 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
14940 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14950 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72  xt {.  int reser
14960 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ved;.  const cha
14970 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
14980 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
14990 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
149a0 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79  */.};..struct By
149b0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b  teRangeLockPB2.{
149c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
149d0 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20   long offset;   
149e0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74       /* offset t
149f0 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
14a00 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
14a10 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14a20 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  gth;        /* n
14a30 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  br of bytes to l
14a40 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14a50 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52  d long long retR
14a60 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62  angeStart; /* nb
14a70 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f  r of 1st byte lo
14a80 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66  cked if successf
14a90 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ul */.  unsigned
14aa0 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67   char unLockFlag
14ab0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d  ;         /* 1 =
14ac0 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63   unlock, 0 = loc
14ad0 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
14ae0 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61  char startEndFla
14af0 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65  g;       /* 1=re
14b00 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b  l to end of fork
14b10 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74  , 0=rel to start
14b20 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
14b50 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68  desc to assoc th
14b60 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a  is lock with */.
14b70 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66  };..#define afpf
14b80 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
14b90 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57  SCTL        _IOW
14ba0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
14bb0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
14bc0 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B2)../*.** This 
14bd0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72  is a utility for
14be0 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61   setting or clea
14bf0 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65  ring a bit-range
14c00 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41   lock on an.** A
14c10 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  FP filesystem..*
14c20 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  * .** Return SQL
14c30 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
14c40 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  s, SQLITE_BUSY o
14c50 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
14c60 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c  atic int afpSetL
14c70 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
14c80 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
14c90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14ca0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
14cb0 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b  locked or unlock
14cc0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ed */.  unixFile
14cd0 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
14ce0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
14cf0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
14d00 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69  n path */.  unsi
14d10 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
14d20 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69  ffset,     /* Fi
14d30 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
14d40 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  ocked */.  unsig
14d50 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
14d60 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ngth,     /* Num
14d70 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
14d80 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65  lock */.  int se
14d90 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20  tLockFlag       
14da0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14db0 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46   to set lock.  F
14dc0 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f  alse to clear lo
14dd0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
14de0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
14df0 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72  B2 pb;.  int err
14e00 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
14e10 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
14e20 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
14e30 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
14e40 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
14e50 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
14e60 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
14e70 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
14e80 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  >h;.  .  OSTRACE
14e90 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  (("AFPSETLOCK [%
14ea0 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
14eb0 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
14ec0 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
14ed0 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
14ee0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
14ef0 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
14f00 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66  -1]":""),.    of
14f10 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a  fset, length));.
14f20 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
14f30 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
14f40 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
14f50 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
14f60 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
14f70 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
14f80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14f90 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
14fa0 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  ETLOCK failed to
14fb0 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
14fc0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
14fd0 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e       path, tErrn
14fe0 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
14ff0 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51  no)));.#ifdef SQ
15000 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
15010 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
15020 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15030 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
15040 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15050 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15060 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15070 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
15080 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
15090 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
150a0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
150b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
150c0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
150d0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
150e0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
150f0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
15100 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15110 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
15120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15130 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
15140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15150 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
15160 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
15170 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
15180 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
15190 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
151a0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
151b0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
151c0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
151d0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
151e0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
151f0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
15200 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
15210 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
15220 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
15230 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
15240 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
15250 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
15260 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15270 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
15280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15290 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
152a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
152b0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
152c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
152d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
152e0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
152f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15300 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15310 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15320 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
15330 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
15340 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
15350 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
15360 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
15370 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
15380 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
15390 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
153a0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
153b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
153c0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
153d0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
153e0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
153f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15400 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
15410 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
15420 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
15430 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
15440 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
15450 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
15460 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
15470 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
15480 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
15490 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
154a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
154b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
154c0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
154d0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
154e0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
154f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
15500 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
15510 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
15520 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
15530 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
15540 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
15550 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15560 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15570 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15580 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
15590 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
155a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
155b0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
155c0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
155d0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
155e0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
155f0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
15600 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
15610 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
15620 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15630 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
15640 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
15650 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15660 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
15670 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
15680 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
15690 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
156a0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
156b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
156c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
156d0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
156e0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
156f0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
15700 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15710 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
15720 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
15730 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
15740 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
15750 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
15760 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
15770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15780 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
15790 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
157a0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
157b0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
157c0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
157d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
157e0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
157f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
15800 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
15810 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
15820 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
15830 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
15840 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
15850 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
15860 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
15870 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
15880 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
15890 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
158a0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
158b0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
158c0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
158d0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
158e0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
158f0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
15900 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
15910 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
15920 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
15930 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
15940 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
15950 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
15960 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
15970 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
15980 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
15990 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
159a0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
159b0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
159c0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
159d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
159e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
159f0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
15a00 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
15a10 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
15a20 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
15a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15a40 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
15a50 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
15a60 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
15a70 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
15a80 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
15a90 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
15aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
15ab0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15ac0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
15ad0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
15ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
15af0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15b00 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15b10 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
15b20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
15b30 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
15b40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
15b50 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
15b60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
15b70 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
15b80 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
15b90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
15ba0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
15bb0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
15bc0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
15bd0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
15be0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
15bf0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
15c00 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
15c10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
15c20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
15c30 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
15c40 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
15c50 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
15c60 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
15c70 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15c80 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
15c90 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
15ca0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
15cb0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
15cc0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
15cd0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
15ce0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
15cf0 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
15d00 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
15d10 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
15d20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
15d30 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
15d40 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
15d50 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
15d60 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
15d70 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
15d80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
15d90 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
15da0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
15db0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15dc0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
15dd0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15de0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
15df0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
15e00 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
15e10 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
15e20 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
15e30 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
15e40 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
15e50 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
15e60 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
15e70 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
15e80 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
15e90 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
15ea0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
15eb0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
15ec0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
15ed0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
15ee0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
15ef0 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
15f00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15f10 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15f20 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
15f30 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
15f40 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
15f50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
15f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
15f70 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
15f80 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
15f90 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
15fa0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
15fb0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
15fc0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
15fd0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
15fe0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
15ff0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
16000 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
16010 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
16020 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
16030 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
16040 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
16050 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
16060 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
16070 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
16080 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
16090 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
160a0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
160b0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
160c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
160d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
160e0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
160f0 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
16100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16110 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
16120 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
16130 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
16140 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
16150 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
16160 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
16170 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
16180 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
16190 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
161a0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
161b0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
161c0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
161d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
161e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
161f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
16200 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
16210 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
16220 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16230 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
16240 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
16250 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
16260 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16270 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
16280 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16290 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
162a0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
162b0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
162c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
162d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
162e0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
162f0 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
16300 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
16310 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
16320 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
16330 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
16340 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
16350 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
16360 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
16370 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
16380 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16390 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
163a0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
163b0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
163c0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
163d0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
163e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
163f0 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
16400 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
16410 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
16420 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
16430 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
16440 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
16450 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
16460 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16470 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
16480 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
16490 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
164a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
164b0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
164c0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
164d0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
164e0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
164f0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
16500 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
16510 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
16520 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
16530 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
16540 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
16550 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
16560 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16570 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
16580 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
16590 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c  Errno = 0;.    l
165a0 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
165b0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
165c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
165d0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
165e0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
165f0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
16600 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
16610 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
16620 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
16630 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
16640 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
16650 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
16660 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
16670 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
16680 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
16690 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
166a0 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
166b0 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
166c0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
166d0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
166e0 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
166f0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
16700 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
16710 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16720 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
16730 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
16740 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
16750 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
16760 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16770 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
16780 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
16790 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
167a0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
167b0 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
167c0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
167d0 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
167e0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
167f0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16800 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
16810 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
16820 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
16830 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
16840 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
16850 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  no = lrc1Errno;.
16860 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
16870 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
16880 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
16890 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
168a0 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
168b0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
168c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
168d0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
168e0 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
168f0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
16900 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
16910 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
16920 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16930 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
16940 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
16950 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
16960 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
16970 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
16980 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
16990 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
169a0 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
169b0 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
169c0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
169d0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
169e0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
169f0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
16a00 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
16a10 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
16a20 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
16a30 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
16a40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
16a50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
16a60 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
16a70 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
16a80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
16a90 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
16aa0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
16ab0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
16ac0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
16ad0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
16ae0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
16af0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
16b00 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
16b10 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
16b20 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
16b30 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
16b40 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
16b50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
16b60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
16b70 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
16b80 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
16b90 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
16ba0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16bb0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16bc0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
16bd0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
16be0 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
16bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
16c00 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
16c10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16c20 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
16c30 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
16c40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
16c50 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
16c60 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
16c70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
16c80 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
16c90 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
16ca0 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
16cb0 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
16cc0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
16cd0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
16ce0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16cf0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
16d00 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
16d10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16d20 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
16d30 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16d40 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16d50 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
16d80 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
16d90 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
16da0 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
16db0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
16dc0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
16dd0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
16de0 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
16df0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
16e00 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16e10 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16e20 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16e30 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
16e60 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
16e70 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
16e80 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
16e90 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16ea0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
16ed0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16ee0 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
16ef0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
16f00 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
16f10 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
16f20 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
16f30 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
16f40 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
16f50 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
16f60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16f70 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
16f80 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
16f90 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
16fa0 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20  ) ? failed2 : . 
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16fc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
16fd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
16fe0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16ff0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
17000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
17010 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20   = failed; .    
17020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17030 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
17040 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
17050 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
17060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17070 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
17080 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17090 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
170a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
170b0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
170c0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
170d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
170e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
170f0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
17100 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
17110 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17120 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
17130 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a    .afp_end_lock:
17140 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
17150 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
17160 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
17170 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
17180 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
17190 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
171a0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
171b0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
171c0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
171d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
171e0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
171f0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
17200 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
17210 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
17220 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
17230 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
17240 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
17250 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
17260 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17270 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
17280 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
17290 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
172a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
172b0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
172c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
172d0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
172e0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
172f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
17300 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
17310 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17320 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
17330 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17340 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
17350 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
17360 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
17370 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
17380 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
17390 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
173a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
173b0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
173c0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
173d0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
173e0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
173f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
17400 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
17410 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
17420 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
17430 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
17440 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
17450 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
17460 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17470 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
17480 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
17490 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
174a0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67  ed,.           g
174b0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
174c0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
174d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
174e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
174f0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
17500 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
17510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17520 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
17530 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
17540 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
17550 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
17560 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
17570 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17580 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
17590 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
175a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
175b0 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
175c0 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
175d0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
175e0 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
175f0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
17600 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
17610 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
17620 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
17630 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
17640 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
17650 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
17660 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
17670 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
17680 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
17690 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
176a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
176b0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
176c0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
176d0 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
176e0 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
176f0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
17700 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
17710 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17720 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
17730 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
17740 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
17750 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
17760 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
17770 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
17780 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
17790 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
177a0 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
177b0 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
177c0 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
177d0 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
177e0 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
177f0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
17800 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
17810 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17820 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
17830 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
17840 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
17850 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
17860 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
17870 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Chng==1 );.    p
17880 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
17890 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
178a0 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
178b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  le->eFileLock==E
178c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
178d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
178e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
178f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
17900 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
17910 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
17920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17930 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
17940 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17950 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
17960 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  red>1) ){.      
17970 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
17980 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17990 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
179a0 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
179b0 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
179c0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
179d0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
179e0 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
179f0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17a00 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17a10 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
17a20 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
17a30 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17a40 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
17a50 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17a60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17a70 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
17a80 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
17a90 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
17aa0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17ab0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17ac0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
17ad0 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
17ae0 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
17af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17b00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
17b10 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
17b20 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  & context->reser
17b30 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ved ){.      rc 
17b40 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17b50 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17b60 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
17b70 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 1, 0);.     
17b80 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20   if( !rc ){ .   
17b90 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
17ba0 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20  served = 0; .   
17bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17bd0 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
17be0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
17bf0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
17c00 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  )){.      pInode
17c10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
17c20 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
17c30 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
17c40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c  QLITE_OK && eFil
17c50 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
17c60 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  {..    /* Decrem
17c70 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
17c80 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
17c90 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
17ca0 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
17cb0 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
17cc0 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
17cd0 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
17ce0 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
17cf0 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
17d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69  .    */.    unsi
17d10 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
17d20 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
17d30 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
17d40 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
17d50 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
17d60 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
17d70 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
17d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75  =0 ){.      Simu
17d90 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17da0 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
17db0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
17dc0 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
17dd0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17de0 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
17df0 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20  !skipShared ){. 
17e00 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
17e10 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17e20 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
17e30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
17e40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
17e50 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
17e60 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
17e70 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
17e80 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
17e90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
17ea0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
17eb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17ec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ed0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
17ee0 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
17ef0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
17f00 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
17f10 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
17f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
17f30 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
17f40 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
17f50 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
17f60 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f80 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
17f90 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17fa0 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
17fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
17fc0 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
17fd0 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
17fe0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
17ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
18000 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
18010 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
18020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18030 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
18040 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
18050 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18060 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
18070 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
18080 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18090 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
180a0 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
180b0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
180c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
180d0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
180e0 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
180f0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
18100 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
18110 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
18120 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
18130 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
18140 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
18150 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
18160 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
18170 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e   pInode->aPendin
18180 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
18190 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
181a0 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
181b0 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
181c0 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
181d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65    */.      setPe
181e0 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
181f0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
18200 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18220 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
18230 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
18240 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
18250 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78  le(id);.    unix
18260 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18270 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18280 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
18290 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
182a0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
182b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
182c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
182d0 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
182e0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
182f0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
18300 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
18310 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
18320 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
18330 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
18340 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
18350 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
18360 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
18370 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
18380 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
18390 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
183a0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
183b0 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
183c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
183d0 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
183e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
183f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18400 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18450 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
18460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
184b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184c0 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63  ** Begin NFS Loc
184d0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184f0 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
18500 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
18510 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
18520 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
18530 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
18540 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
18550 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18560 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
18570 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20  ck.  eFileLock. 
18580 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
18590 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
185a0 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
185b0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
185c0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
185d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
185e0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
185f0 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
18600 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18610 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18620 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
18630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66  */.static int nf
18640 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
18650 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
18660 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  ileLock){.  retu
18670 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
18680 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29  d, eFileLock, 1)
18690 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
186a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
186b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
186c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
186d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
186e0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
186f0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18700 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
18710 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18720 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18730 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18740 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
18750 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
18760 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
18770 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a  ilable.  .**.***
18780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18790 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46  ** End of the NF
187a0 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
187b0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
187c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
187d0 2a 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 2a 2a 2a 2a  ****************
187f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a  ***********/../*
18820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
18880 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
18890 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
188c0 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
188d0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
188e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
188f0 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
18900 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
18910 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
18920 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
18930 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
18940 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
18950 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
18960 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
18970 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
18980 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
18990 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
189a0 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
189b0 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
189c0 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
189d0 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
189e0 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
189f0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
18a00 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
18a10 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
18a20 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
18a30 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
18a40 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
18a50 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
18a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18a70 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
18a80 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
18a90 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
18aa0 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
18ab0 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
18ac0 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
18ad0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
18ae0 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
18af0 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
18b00 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
18b10 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
18b20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
18b30 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
18b40 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
18b50 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d  .** any any form
18b60 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
18b70 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
18b80 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
18b90 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
18ba0 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
18bb0 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20  nd #2681..**.** 
18bc0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
18bd0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
18be0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65  e on a failed re
18bf0 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  ad the lastErrno
18c00 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
18c10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18c20 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18c30 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
18c40 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
18c50 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
18c60 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
18c70 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
18c80 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20  ;.  int prior = 
18c90 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64  0;.#if (!defined
18ca0 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21  (USE_PREAD) && !
18cb0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18cc0 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f  D64)).  i64 newO
18cd0 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ffset;.#endif.  
18ce0 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61  TIMER_START;.  a
18cf0 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74  ssert( cnt==(cnt
18d00 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63  &0x1ffff) );.  c
18d10 6e 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  nt &= 0x1ffff;. 
18d20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
18d30 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20  (USE_PREAD).    
18d40 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64  got = osPread(id
18d50 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18d60 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
18d70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
18d80 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
18d90 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18da0 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  D64).    got = o
18db0 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20  sPread64(id->h, 
18dc0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
18dd0 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
18de0 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
18df0 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e  1 );.#else.    n
18e00 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
18e10 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
18e20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
18e30 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18e40 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18e50 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
18e60 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
18e70 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
18e80 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  == -1 ){.       
18e90 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18ea0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18eb0 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rno;.      }else
18ec0 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
18ed0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18ee0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  rrno = 0;.      
18ef0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  }.      return -
18f00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  1;.    }.    got
18f10 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c   = osRead(id->h,
18f20 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
18f30 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d  dif.    if( got=
18f40 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  =cnt ) break;.  
18f50 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
18f60 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
18f70 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31  EINTR ){ got = 1
18f80 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20  ; continue; }.  
18f90 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20      prior = 0;. 
18fa0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
18fb0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18fc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62  = errno;.      b
18fd0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  reak;.    }else 
18fe0 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20  if( got>0 ){.   
18ff0 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20     cnt -= got;. 
19000 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67       offset += g
19010 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ot;.      prior 
19020 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42  += got;.      pB
19030 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74  uf = (void*)(got
19040 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b   + (char*)pBuf);
19050 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
19060 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45   got>0 );.  TIME
19070 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
19080 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  (("READ    %-3d 
19090 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
190a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
190b0 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c  d->h, got+prior,
190c0 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54   offset-prior, T
190d0 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
190e0 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69    return got+pri
190f0 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  or;.}../*.** Rea
19100 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
19110 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
19120 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
19130 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
19140 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
19150 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
19160 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
19170 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
19180 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
19190 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
191a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
191b0 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
191c0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
191d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
191e0 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
191f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19200 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
19210 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
19220 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   id );..  /* If 
19230 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
19240 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
19250 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
19260 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
19270 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
19280 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
19290 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
192a0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
192b0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
192c0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
192d0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
192e0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
192f0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
19300 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
19310 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
19320 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
19330 69 66 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  if..  /* Deal wi
19340 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
19350 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
19360 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
19370 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
19380 20 64 61 74 61 20 74 6f 20 74 68 65 20 6d 65 6d   data to the mem
19390 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
193a0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
193b0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
193c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
193d0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
193e0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
193f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
19400 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
19410 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
19420 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
19430 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
19440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19460 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
19470 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
19480 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
19490 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
194a0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
194b0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
194c0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
194d0 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
194e0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
194f0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
19500 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
19510 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
19520 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
19530 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
19540 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
19550 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
19560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19570 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
19580 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19590 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
195a0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
195b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
195c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
195d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
195e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
195f0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
19600 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
19610 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
19620 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
19630 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
19640 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
19650 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
19660 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
19670 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
19680 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
19690 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
196a0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
196b0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
196c0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
196d0 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
196e0 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
196f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19700 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
19710 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
19720 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
19730 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
19740 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
19750 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
19760 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
19770 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
19780 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
19790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
197a0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
197b0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
197c0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
197d0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
197e0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
197f0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
19800 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
19810 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
19820 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
19830 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
19840 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
19850 66 66 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20  ff) );.  cnt &= 
19860 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
19870 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
19880 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19890 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
198a0 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
198b0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
198c0 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
198d0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
198e0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
198f0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
19900 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36   got = osPwrite6
19910 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
19920 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69  nt, offset);}whi
19930 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
19940 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73  no==EINTR);.#els
19950 65 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f  e.  do{.    newO
19960 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
19970 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
19980 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
19990 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
199a0 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20  Offset-- );.    
199b0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
199c0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
199d0 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
199e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28  -1 ){.        ((
199f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
19a00 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
19a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19a20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
19a30 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
19a40 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  o = 0;.      }. 
19a50 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
19a60 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
19a70 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  osWrite(id->h, p
19a80 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68  Buf, cnt);.  }wh
19a90 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
19aa0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
19ab0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
19ac0 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
19ad0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
19ae0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
19af0 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20  = errno;.  }..  
19b00 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
19b10 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
19b20 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
19b30 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
19b40 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
19b50 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
19b60 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
19b70 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
19b80 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
19b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
19ba0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
19bb0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
19bc0 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
19bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19be0 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
19bf0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
19c00 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
19c10 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
19c20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19c30 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
19c40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19c50 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
19c60 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
19c70 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
19c80 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
19c90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
19ca0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
19cb0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
19cc0 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
19cd0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
19ce0 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
19cf0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
19d00 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
19d10 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
19d20 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
19d30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
19d40 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
19d50 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
19d60 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
19d70 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
19d80 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
19d90 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
19da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19db0 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
19dc0 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
19dd0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
19de0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
19df0 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
19e00 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
19e10 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
19e20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
19e30 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
19e40 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
19e50 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
19e60 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
19e70 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
19e80 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
19e90 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
19ea0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19eb0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
19ec0 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
19ed0 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
19ee0 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
19ef0 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
19f00 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
19f10 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
19f20 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
19f30 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
19f40 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
19f50 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
19f60 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
19f70 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
19f80 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
19f90 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
19fa0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
19fb0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
19fc0 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
19fd0 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
19fe0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19ff0 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1a000 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1a010 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1a020 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1a030 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1a040 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1a050 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1a060 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1a070 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1a080 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1a090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1a0a0 69 66 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  if..  /* Deal wi
1a0b0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1a0c0 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1a0d0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1a0e0 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1a0f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1a100 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1a110 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1a120 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1a130 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1a140 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1a150 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1a160 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1a170 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1a180 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a190 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1a1a0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1a1b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a1c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a1d0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1a1e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1a1f0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1a200 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1a210 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1a220 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1a230 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1a240 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1a250 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1a260 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1a270 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1a280 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1a290 7d 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  }..  while( amt>
1a2a0 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65  0 && (wrote = se
1a2b0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1a2c0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1a2d0 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
1a2e0 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
1a2f0 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65   offset += wrote
1a300 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
1a310 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
1a320 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  e];.  }.  Simula
1a330 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
1a340 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
1a350 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
1a360 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
1a370 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a  e=0, amt=1 ));..
1a380 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
1a390 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
1a3a0 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
1a3b0 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
1a3c0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1a3d0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
1a3e0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
1a3f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a400 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
1a410 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
1a420 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
1a430 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1a440 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
1a450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a460 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
1a470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a480 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1a490 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
1a4a0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
1a4b0 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
1a4c0 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
1a4d0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
1a4e0 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
1a4f0 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
1a500 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
1a510 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
1a520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a530 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
1a540 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
1a550 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
1a560 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
1a570 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
1a580 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
1a590 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
1a5a0 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
1a5b0 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
1a5c0 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
1a5d0 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
1a5e0 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c  ith the (slightl
1a5f0 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79  y slower).** fsy
1a600 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f  nc(). If you kno
1a610 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74  w that your syst
1a620 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  em does support 
1a630 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72  fdatasync() corr
1a640 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73  ectly,.** then s
1a650 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69  imply compile wi
1a660 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66  th -Dfdatasync=f
1a670 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20  datasync.*/.#if 
1a680 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1a690 6e 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61  nc).# define fda
1a6a0 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
1a6b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
1a6c0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a6d0 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
1a6e0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1a6f0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
1a700 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
1a710 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
1a720 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
1a730 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
1a740 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
1a750 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
1a760 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
1a770 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
1a780 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
1a790 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
1a7a0 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
1a7b0 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
1a7c0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
1a7d0 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
1a7e0 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
1a7f0 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
1a800 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
1a810 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
1a820 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
1a830 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
1a840 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
1a850 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
1a860 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
1a870 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
1a880 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
1a890 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
1a8a0 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
1a8b0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
1a8c0 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
1a8d0 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
1a8e0 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
1a8f0 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
1a900 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
1a910 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1a920 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
1a930 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
1a940 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1a950 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
1a960 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
1a970 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
1a980 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
1a990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a9a0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
1a9b0 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
1a9c0 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
1a9d0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
1a9e0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
1a9f0 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
1aa00 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
1aa10 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
1aa20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
1aa30 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
1aa40 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
1aa50 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
1aa60 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
1aa70 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
1aa80 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
1aa90 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1aaa0 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
1aab0 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
1aac0 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
1aad0 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
1aae0 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
1aaf0 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
1ab00 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
1ab10 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
1ab20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
1ab30 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1ab40 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
1ab50 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
1ab60 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
1ab70 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1ab80 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
1ab90 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
1aba0 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
1abb0 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
1abc0 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
1abd0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
1abe0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
1abf0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
1ac00 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
1ac10 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
1ac20 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
1ac30 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
1ac40 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
1ac50 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
1ac60 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
1ac70 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
1ac80 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
1ac90 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
1aca0 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
1acb0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1acc0 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
1acd0 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
1ace0 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
1acf0 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
1ad00 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
1ad10 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
1ad20 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
1ad30 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
1ad40 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
1ad50 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
1ad60 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
1ad70 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
1ad80 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
1ad90 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
1ada0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
1adb0 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
1adc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1add0 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
1ade0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1adf0 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
1ae00 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1ae10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ae20 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1ae30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1ae40 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
1ae50 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1ae60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ae70 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1ae80 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
1ae90 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1aea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1aeb0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1aec0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
1aed0 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
1aee0 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
1aef0 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
1af00 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
1af10 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
1af20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
1af30 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
1af40 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
1af50 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
1af60 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
1af70 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
1af80 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1af90 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
1afa0 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
1afb0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1afc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
1afd0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1afe0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
1aff0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
1b000 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
1b010 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
1b020 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
1b030 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1b040 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
1b050 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
1b060 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1b070 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1b080 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1b090 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1b0a0 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1b0b0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1b0c0 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1b0d0 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1b0e0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1b0f0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1b100 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1b110 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1b120 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1b130 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1b140 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1b150 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1b160 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1b170 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1b180 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1b190 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1b1a0 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1b1b0 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1b1c0 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1b1d0 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1b1e0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1b1f0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1b200 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1b210 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1b220 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1b230 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1b240 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1b250 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1b260 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1b270 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1b280 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1b290 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1b2a0 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1b2b0 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1b2c0 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1b2d0 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1b2e0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1b2f0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1b300 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1b310 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1b320 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1b330 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1b340 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1b350 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1b360 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1b370 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1b380 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1b390 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1b3a0 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1b3b0 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1b3c0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1b3d0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1b3e0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1b3f0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1b400 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1b410 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1b420 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1b430 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1b440 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1b450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b460 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1b470 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1b480 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1b490 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1b4a0 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1b4b0 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1b4c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1b4d0 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1b4e0 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1b4f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b500 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1b510 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1b520 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1b530 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1b540 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1b550 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1b560 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1b570 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1b580 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1b590 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1b5a0 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1b5b0 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1b5c0 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1b5d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1b5e0 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1b5f0 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1b600 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1b610 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1b620 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1b630 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1b640 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1b650 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1b660 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1b670 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1b680 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b690 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1b6a0 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1b6b0 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1b6c0 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1b6d0 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1b6e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1b6f0 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1b700 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1b710 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1b720 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1b730 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1b740 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1b750 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1b760 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1b770 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1b780 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1b790 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1b7a0 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1b7b0 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1b7c0 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1b7d0 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1b7e0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1b7f0 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1b800 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1b810 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1b820 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1b830 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1b840 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1b850 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1b860 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1b870 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1b880 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1b890 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1b8a0 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1b8b0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1b8c0 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1b8d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1b8e0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1b8f0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1b900 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1b910 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1b920 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1b930 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1b940 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1b950 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1b960 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1b970 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1b980 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1b990 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1b9a0 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1b9b0 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1b9c0 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1b9d0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
1b9e0 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1b9f0 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1ba00 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1ba10 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1ba20 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1ba30 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1ba40 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1ba50 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1ba60 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1ba70 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1ba80 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ba90 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1baa0 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1bab0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1bac0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1bad0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1bae0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1baf0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1bb00 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1bb10 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1bb20 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1bb30 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1bb40 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1bb50 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1bb60 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1bb70 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1bb80 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1bb90 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1bba0 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1bbb0 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1bbc0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1bbd0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1bbe0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1bbf0 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1bc00 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1bc10 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1bc20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1bc30 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1bc40 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1bc50 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1bc60 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1bc70 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1bc80 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1bc90 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1bca0 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1bcb0 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1bcc0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1bcd0 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1bce0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1bcf0 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1bd00 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1bd10 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1bd20 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1bd30 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1bd40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1bd50 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1bd60 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1bd70 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1bd80 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1bd90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1bda0 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1bdb0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1bdc0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1bdd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1bde0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1bdf0 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1be00 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1be10 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1be20 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1be30 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1be40 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1be50 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1be60 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1be70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1be80 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1be90 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1bea0 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1beb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1bec0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1bed0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1bee0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1bef0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1bf00 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1bf10 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1bf20 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1bf30 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1bf40 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1bf50 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1bf60 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1bf70 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1bf80 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1bf90 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1bfa0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1bfb0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1bfc0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1bfd0 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1bfe0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1bff0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1c000 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1c010 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1c020 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1c030 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1c040 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1c050 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1c060 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1c070 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c080 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1c090 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1c0a0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1c0b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1c0c0 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1c0d0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1c0e0 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1c0f0 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1c100 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1c110 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1c120 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rance.  Many sys
1c130 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1c140 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1c150 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1c160 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1c170 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1c180 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1c190 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1c1a0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1c1b0 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1c1c0 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1c1d0 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1c1e0 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1c1f0 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1c200 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1c210 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1c220 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1c230 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1c240 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1c250 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1c260 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1c270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c280 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d  TE_OK && dirfd>=
1c290 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  0 ){.      full_
1c2a0 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1c2b0 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  0);.      robust
1c2c0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69  _close(pFile, di
1c2d0 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1c2e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1c2f0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
1c300 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  N ){.      rc = 
1c310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c320 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1c330 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49  Flags &= ~UNIXFI
1c340 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a  LE_DIRSYNC;.  }.
1c350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c360 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1c370 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1c380 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1c390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1c3a0 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1c3b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1c3c0 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46   nByte){.  unixF
1c3d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c3e0 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1c3f0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1c400 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
1c410 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1c420 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c430 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20  _TRUNCATE );..  
1c440 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
1c450 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
1c460 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
1c470 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
1c480 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
1c490 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
1c4a0 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
1c4b0 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
1c4c0 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
1c4d0 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
1c4e0 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
1c4f0 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
1c500 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
1c510 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
1c520 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
1c530 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1c540 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
1c550 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
1c560 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
1c570 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1c580 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1c590 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75    }..  rc = robu
1c5a0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1c5b0 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  le->h, (off_t)nB
1c5c0 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
1c5d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1c5e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1c5f0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1c600 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1c610 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1c620 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1c630 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1c640 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
1c650 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
1c660 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1c670 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1c680 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1c690 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1c6a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1c6b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1c6c0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1c6d0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1c6e0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1c6f0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1c700 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1c710 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1c720 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1c730 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1c740 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1c750 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1c760 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1c770 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1c780 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1c790 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1c7a0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1c7b0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1c7c0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1c7d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1c7e0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1c7f0 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1c800 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1c810 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1c820 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1c830 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1c840 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63  e was just trunc
1c850 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
1c860 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1c870 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
1c880 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
1c890 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1c8a0 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
1c8b0 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
1c8c0 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  e will.    ** us
1c8d0 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
1c8e0 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
1c8f0 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
1c900 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
1c910 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n.  .    */.    
1c920 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d  if( nByte<pFile-
1c930 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1c940 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1c950 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze = nByte;.    
1c960 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  }..    return SQ
1c970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1c980 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1c990 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1c9a0 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1c9b0 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1c9c0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1c9d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c9e0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1c9f0 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1ca00 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1ca10 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1ca20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78  = osFstat(((unix
1ca30 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
1ca40 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
1ca50 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1ca60 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1ca70 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1ca80 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1ca90 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1caa0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1cab0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1cac0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1cad0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1cae0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1caf0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1cb00 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1cb10 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1cb20 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1cb30 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1cb40 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1cb50 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1cb60 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1cb70 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1cb80 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1cb90 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1cba0 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1cbb0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1cbc0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1cbd0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1cbe0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1cbf0 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1cc00 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1cc10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1cc20 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1cc30 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
1cc40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1cc50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cc60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1cc70 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1cc80 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
1cc90 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
1cca0 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
1ccb0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
1ccc0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
1ccd0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
1cce0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
1ccf0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
1cd00 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1cd10 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
1cd20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
1cd30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cd40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
1cd50 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
1cd60 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1cd70 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
1cd80 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
1cd90 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
1cda0 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
1cdb0 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
1cdc0 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
1cdd0 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
1cde0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1cdf0 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
1ce00 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
1ce10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1ce20 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1ce30 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1ce40 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1ce50 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1ce60 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1ce70 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
1ce80 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
1ce90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1cea0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1ceb0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1cec0 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1ced0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1cee0 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
1cef0 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
1cf00 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
1cf10 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
1cf20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53  &buf) ) return S
1cf30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1cf40 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  T;..    nSize = 
1cf50 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
1cf60 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
1cf70 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1cf80 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1cf90 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
1cfa0 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
1cfb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1cfc0 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1cfd0 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
1cfe0 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
1cff0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
1d000 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
1d010 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1d020 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
1d030 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
1d040 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
1d050 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
1d060 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
1d070 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
1d080 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
1d090 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
1d0a0 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
1d0b0 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
1d0c0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1d0d0 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
1d0e0 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
1d0f0 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
1d100 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
1d110 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
1d120 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
1d130 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
1d140 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
1d150 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rr ) return SQLI
1d160 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1d170 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1d180 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1d190 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1d1a0 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1d1b0 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20  t. First use.   
1d1c0 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28     ** ftruncate(
1d1d0 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c  ) to set the fil
1d1e0 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69  e size, then wri
1d1f0 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  te a single byte
1d200 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
1d210 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61   last byte in ea
1d220 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  ch block within 
1d230 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1d240 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20  ion. This.      
1d250 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74  ** is the same t
1d260 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79  echnique used by
1d270 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d   glibc to implem
1d280 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ent posix_falloc
1d290 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ate().      ** o
1d2a0 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  n systems that d
1d2b0 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1d2c0 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79  l fallocate() sy
1d2d0 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20  stem call..     
1d2e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
1d2f0 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73  lk = buf.st_blks
1d300 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79  ize;  /* File-sy
1d310 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20  stem block size 
1d320 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72  */.      i64 iWr
1d330 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1d340 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66       /* Next off
1d350 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  set to write to 
1d360 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f  */..      if( ro
1d370 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1d380 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20  File->h, nSize) 
1d390 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1d3a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1d3b0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
1d3c0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d3d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d3e0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d3f0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d400 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1d410 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66    iWrite = ((buf
1d420 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c  .st_size + 2*nBl
1d430 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c  k - 1)/nBlk)*nBl
1d440 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  k-1;.      while
1d450 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29  ( iWrite<nSize )
1d460 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57  {.        int nW
1d470 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
1d480 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
1d490 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
1d4a0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1d4b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d4c0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1d4d0 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20        iWrite += 
1d4e0 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nBlk;.      }.#e
1d4f0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
1d500 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1d510 70 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  pLimit>0 ){.    
1d520 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
1d530 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d  pFile->szChunk<=
1d540 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  0 ){.      if( r
1d550 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1d560 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1d570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1d580 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1d590 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1d5a0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1d5b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1d5c0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1d5d0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1d5e0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1d5f0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   }..    rc = uni
1d600 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  xMapfile(pFile, 
1d610 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75  nByte);.    retu
1d620 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  rn rc;.  }..  re
1d630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d640 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
1d650 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79  g is inititially
1d660 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
1d670 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
1d680 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
1d690 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
1d6a0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1d6b0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
1d6c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1d6d0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
1d6e0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
1d6f0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
1d700 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
1d710 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
1d720 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
1d730 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69   void unixModeBi
1d740 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1d750 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
1d760 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
1d770 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
1d780 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
1d790 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
1d7a0 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
1d7b0 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
1d7c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
1d7d0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1d7e0 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
1d7f0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1d800 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
1d810 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
1d820 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
1d830 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
1d840 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1d850 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b  uf, char *zBuf);
1d860 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1d870 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1d880 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1d890 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1d8a0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1d8b0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1d8c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1d8d0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1d8e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1d8f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1d900 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1d910 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d920 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1d930 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1d940 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1d950 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1d960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d970 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d980 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1d990 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1d9a0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1d9b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1d9c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d9d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1d9e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1d9f0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1da00 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1da10 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1da20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1da30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1da40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1da50 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1da60 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1da70 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1da80 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1da90 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1daa0 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1dab0 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1dac0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1dad0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1dae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1daf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1db00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1db10 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1db20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1db30 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
1db40 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1db50 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1db60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1db70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1db80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
1db90 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1dba0 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1dbb0 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1dbc0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1dbd0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
1dbe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dbf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1dc00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
1dc10 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
1dc20 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
1dc30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1dc40 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
1dc50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1dc60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dc70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1dc80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
1dc90 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
1dca0 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
1dcb0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1dcc0 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78   pFile->pVfs->mx
1dcd0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Pathname );.    
1dce0 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a    if( zTFile ){.
1dcf0 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54          unixGetT
1dd00 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
1dd10 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
1dd20 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20   zTFile);.      
1dd30 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1dd40 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
1dd50 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1dd60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1dd70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dd80 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a  FCNTL_MMAP_SIZE:
1dd90 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1dda0 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 2a 28 69 36  mmapLimit = *(i6
1ddb0 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72  4*)pArg;.      r
1ddc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ddd0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1dde0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1ddf0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1de00 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1de10 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1de20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1de30 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1de40 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1de50 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1de60 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1de70 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1de80 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1de90 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1dea0 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1deb0 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1dec0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ded0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1dee0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1def0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1df00 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1df10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1df20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1df30 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1df40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1df50 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1df60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1df70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
1df80 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a  _LOCKPROXYFILE:.
1df90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dfa0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1dfb0 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1dfc0 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1dfd0 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1dfe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1dff0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e000 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1e010 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1e020 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ) */.  }.  retur
1e030 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
1e040 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
1e050 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
1e060 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
1e070 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
1e080 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
1e090 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
1e0a0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1e0b0 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
1e0c0 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
1e0d0 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
1e0e0 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
1e0f0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
1e100 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
1e110 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
1e120 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
1e130 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
1e140 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
1e150 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
1e160 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
1e170 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
1e180 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
1e190 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
1e1a0 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
1e1b0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
1e1c0 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
1e1d0 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  h..*/.#ifndef __
1e1e0 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63  QNXNTO__ .static
1e1f0 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1e200 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1e210 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1e220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1e230 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1e240 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1e250 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1e260 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1e270 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73  e following vers
1e280 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f  ion of unixSecto
1e290 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d  rSize() is optim
1e2a0 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f  ized for QNX..*/
1e2b0 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1e2c0 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  __.#include <sys
1e2d0 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
1e2e0 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
1e2f0 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74  fs.h>.static int
1e300 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1e310 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e320 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1e330 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1e340 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
1e350 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
1e360 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
1e370 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
1e380 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
1e390 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
1e3a0 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
1e3b0 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
1e3c0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1e3d0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1e3e0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1e3f0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
1e400 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1e410 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
1e420 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
1e430 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
1e440 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
1e450 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
1e460 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
1e470 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1e480 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1e490 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
1e4a0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e4b0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1e4c0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1e4d0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1e4e0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1e4f0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1e500 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
1e510 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
1e520 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1e530 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1e540 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1e550 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1e560 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1e570 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1e580 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1e5c0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1e5d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1e5e0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1e5f0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1e600 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1e610 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e640 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1e650 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1e660 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1e670 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
1e680 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
1e690 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1e6a0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1e6b0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1e6c0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1e6d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1e6e0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
1e6f0 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
1e700 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1e710 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
1e720 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1e730 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1e740 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1e750 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1e760 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1e770 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1e780 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1e790 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1e7d0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1e7e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e7f0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1e800 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1e810 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1e820 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1e860 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1e870 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1e880 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
1e890 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1e8a0 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
1e8b0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1e8c0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1e8d0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1e8e0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1e8f0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1e900 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1e910 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
1e920 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
1e930 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
1e940 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1e950 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1e960 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1e970 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1e980 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1e990 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e9c0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1e9d0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1e9e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1e9f0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1ea00 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1ea10 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1ea20 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1ea50 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1ea60 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1ea70 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
1ea80 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1ea90 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
1eaa0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1eab0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1eac0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1ead0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1eae0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1eaf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
1eb00 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
1eb10 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
1eb20 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
1eb30 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
1eb40 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1eb50 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1eb60 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1eb70 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
1eb80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1eb90 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1eba0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1ebb0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1ebc0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1ec00 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1ec10 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1ec20 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
1ec30 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1ec40 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
1ec50 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ec60 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1ec70 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1ec80 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1ec90 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1eca0 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
1ecb0 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
1ecc0 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
1ecd0 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
1ece0 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
1ecf0 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1ed00 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1ed10 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
1ed20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
1ed30 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1ed40 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1ed50 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1ed60 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1ed70 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1eda0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1edb0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1edc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1edd0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1ede0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1edf0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1ee00 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
1ee10 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
1ee20 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1ee30 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1ee40 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
1ee50 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
1ee60 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
1ee70 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
1eeb0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
1eec0 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
1eed0 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
1eee0 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
1eef0 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
1ef00 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
1ef10 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
1ef20 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
1ef30 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
1ef40 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
1ef50 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
1ef60 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1ef70 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
1ef80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
1ef90 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
1efa0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1efb0 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1efc0 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
1efd0 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Size;.}.#endif /
1efe0 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a  * __QNXNTO__ */.
1eff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f000 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
1f010 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
1f020 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
1f030 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20  s VFS is set up 
1f040 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
1f050 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1f060 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65  _OVERWRITE by de
1f070 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65  fault..** Howeve
1f080 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69  r, that choice i
1f090 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20  s contraversial 
1f0a0 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c  since technicall
1f0b0 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  y the underlying
1f0c0 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20  .** file system 
1f0d0 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  does not always 
1f0e0 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66  provide powersaf
1f0f0 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28  e overwrites.  (
1f100 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
1f110 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  s, after a power
1f120 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72  -loss event, par
1f130 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  ts of the file t
1f140 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a  hat were never.*
1f150 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  * written might 
1f160 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74  end up being alt
1f170 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c  ered.)  However,
1f180 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69   non-PSOW behavi
1f190 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76  or is very,.** v
1f1a0 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61  ery rare.  And a
1f1b0 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61  sserting PSOW ma
1f1c0 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75  kes a large redu
1f1d0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f  ction in the amo
1f1e0 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72  unt.** of requir
1f1f0 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e  ed I/O for journ
1f200 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c  aling, since a l
1f210 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  ot of padding is
1f220 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20   eliminated..** 
1f230 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f   Hence, while PO
1f240 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1f250 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  E is on by defau
1f260 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66  lt, there is a f
1f270 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61  ile-control.** a
1f280 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
1f290 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20   it off and URI 
1f2a0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
1f2b0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
1f2c0 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  n it off..*/.sta
1f2d0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
1f2e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f2f0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1f300 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
1f310 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  *p = (unixFile*)
1f320 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  id;.  int rc = 0
1f330 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54  ;.#ifdef __QNXNT
1f340 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63  O__.  if( p->sec
1f350 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69  torSize==0 ) uni
1f360 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b  xSectorSize(id);
1f370 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63  .  rc = p->devic
1f380 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f390 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1f3a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1f3b0 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
1f3c0 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f     rc |= SQLITE_
1f3d0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1f3e0 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20  OVERWRITE;.  }. 
1f3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1f400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f410 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
1f420 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1f430 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
1f440 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
1f450 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
1f460 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
1f470 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
1f480 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
1f490 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
1f4a0 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
1f4b0 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
1f4c0 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
1f4d0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
1f4e0 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
1f4f0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1f500 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1f510 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
1f520 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
1f530 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
1f540 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
1f550 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
1f560 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
1f570 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
1f580 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
1f590 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
1f5a0 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
1f5b0 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
1f5c0 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
1f5d0 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
1f5e0 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
1f5f0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
1f600 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1f610 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
1f620 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
1f630 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
1f640 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
1f650 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
1f660 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
1f670 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
1f680 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
1f690 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f6a0 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1f6b0 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
1f6c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1f6d0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
1f6e0 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
1f6f0 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
1f700 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
1f710 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
1f720 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
1f730 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
1f740 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
1f750 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
1f760 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
1f770 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
1f780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1f790 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1f7a0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
1f7b0 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
1f7c0 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
1f7d0 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
1f7e0 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
1f7f0 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
1f800 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1f810 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
1f820 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1f830 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1f840 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
1f850 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1f860 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
1f870 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
1f880 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1f890 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
1f8a0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1f8b0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
1f8c0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
1f8d0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
1f8e0 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
1f8f0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1f900 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1f910 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1f920 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1f930 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1f940 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1f950 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
1f960 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
1f990 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
1f9a0 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
1f9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1f9c0 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
1f9d0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1f9e0 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
1f9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fa00 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
1fa10 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
1fa20 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
1fa30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fa40 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
1fa50 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
1fa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1fa70 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
1fa80 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1fa90 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
1faa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fab0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1fac0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
1fad0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1fae0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1faf0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1fb00 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
1fb10 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1fb20 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
1fb30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1fb40 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb60 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
1fb70 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
1fb80 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fba0 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1fbb0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1fbc0 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
1fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1fbe0 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
1fbf0 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
1fc00 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1fc10 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
1fc20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
1fc30 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
1fc40 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
1fc50 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
1fc60 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
1fc70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
1fc80 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1fc90 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
1fca0 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
1fcb0 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
1fcc0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
1fcd0 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
1fce0 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
1fcf0 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
1fd00 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
1fd10 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
1fd20 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
1fd30 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
1fd40 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1fd50 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1fd60 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1fd70 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1fd80 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
1fd90 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1fda0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
1fdb0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
1fdc0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1fdd0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1fde0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
1fdf0 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
1fe00 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
1fe10 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1fe20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
1fe30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1fe40 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
1fe50 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
1fe60 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1fe90 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1fea0 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
1feb0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
1fec0 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1fed0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1fee0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1fef0 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
1ff00 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1ff10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1ff20 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1ff30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
1ff40 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1ff50 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1ff60 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
1ff70 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1ff80 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1ff90 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1ffa0 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1ffb0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
1ffc0 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
1ffd0 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
1ffe0 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
1fff0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
20000 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
20010 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
20020 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
20030 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
20040 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
20050 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
20060 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
20070 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
20080 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
20090 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
200a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
200b0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
200c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
200d0 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79  hmNode, /* Apply
200e0 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
200f0 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
20100 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
20110 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
20120 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
20130 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
20140 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
20150 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
20160 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
20170 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
20180 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
201b0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
201c0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
201d0 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   f;       /* The
201e0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
201f0 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
20200 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
20210 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
20220 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
20230 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
20240 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
20250 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20260 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
20270 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
20280 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
20290 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
202a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
202b0 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
202c0 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
202d0 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
202e0 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
202f0 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
20300 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
20310 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
20320 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
20330 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
20340 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
20350 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48  1 && n<SQLITE_SH
20360 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
20370 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
20380 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
20390 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
203a0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
203b0 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30      memset(&f, 0
203c0 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20  , sizeof(f));.  
203d0 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63    f.l_type = loc
203e0 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77  kType;.    f.l_w
203f0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
20400 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20  ;.    f.l_start 
20410 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f  = ofst;.    f.l_
20420 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63  len = n;..    rc
20430 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e   = osFcntl(pShmN
20440 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ode->h, F_SETLK,
20450 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28   &f);.    rc = (
20460 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49  rc!=(-1)) ? SQLI
20470 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42  TE_OK : SQLITE_B
20480 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  USY;.  }..  /* U
20490 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  pdate the global
204a0 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20   lock state and 
204b0 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67  do debug tracing
204c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
204d0 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20  E_DEBUG.  { u16 
204e0 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28  mask;.  OSTRACE(
204f0 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a  ("SHM-LOCK "));.
20500 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
20510 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
20520 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
20530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
20540 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
20550 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
20560 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
20570 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
20580 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
20590 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
205a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
205b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
205c0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
205d0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
205e0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
205f0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
20600 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
20610 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
20620 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
20630 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
20640 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
20650 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
20660 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
20670 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
20680 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
20690 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
206a0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
206b0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
206c0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
206d0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
206e0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
206f0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
20700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
20710 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
20720 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
20730 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
20740 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
20750 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20760 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
20770 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
20780 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
20790 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
207a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
207b0 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
207c0 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
207d0 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
207e0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
207f0 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
20800 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
20810 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
20820 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
20830 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
20840 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
20850 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
20860 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
20870 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
20880 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  .}.../*.** Purge
20890 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
208a0 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
208b0 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
208c0 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
208d0 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
208e0 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
208f0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
20900 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
20910 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
20920 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
20930 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
20940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20950 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
20960 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
20970 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
20980 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
20990 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
209a0 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
209b0 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
209c0 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
209d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
209e0 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
209f0 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
20a00 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
20a10 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
20a20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20a30 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
20a40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  {.      if( p->h
20a50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  >=0 ){.        m
20a60 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
20a70 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
20a80 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
20a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20aa0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
20ab0 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
20ac0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20ad0 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
20ae0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
20af0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
20b00 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
20b10 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
20b20 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
20b30 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
20b40 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
20b50 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
20b60 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
20b70 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
20b80 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
20b90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20ba0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
20bb0 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
20bc0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
20bd0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
20be0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
20bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
20c00 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
20c10 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
20c20 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
20c30 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
20c40 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
20c50 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
20c60 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
20c70 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
20c80 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
20c90 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
20ca0 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
20cb0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
20cc0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
20cd0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
20ce0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
20cf0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
20d00 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
20d10 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
20d20 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
20d30 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
20d40 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
20d50 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
20d60 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
20d70 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
20d80 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
20d90 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
20da0 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
20db0 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
20dc0 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
20dd0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
20de0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
20df0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
20e00 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
20e10 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
20e20 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
20e30 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
20e40 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
20e50 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
20e60 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
20e70 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
20e80 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
20e90 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
20ea0 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
20eb0 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
20ec0 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
20ed0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
20ee0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
20ef0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
20f00 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
20f10 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
20f20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
20f30 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
20f40 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
20f50 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
20f60 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
20f70 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
20f80 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
20f90 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
20fa0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
20fb0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
20fc0 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
20fd0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
20fe0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
20ff0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
21000 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
21010 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
21020 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21030 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
21040 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
21050 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
21060 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
21070 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
21080 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
21090 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
210a0 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
210b0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
210c0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
210d0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
210e0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
210f0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
21100 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
21110 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
21120 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
21130 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
21140 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
21150 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
21160 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
21170 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
21180 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
21190 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
211a0 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
211b0 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
211c0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
211d0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
211e0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
211f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
21200 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
21210 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
21220 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
21230 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
21240 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
21250 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
21260 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
21270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
21280 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
21290 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
212a0 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
212b0 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
212c0 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
212d0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
212e0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
212f0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
21300 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
21310 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
21320 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
21330 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
21340 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
21350 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
21360 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
21370 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
21380 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
21390 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
213a0 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
213b0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
213c0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
213d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
213e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
213f0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
21400 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
21410 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
21440 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
21450 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
21460 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
21470 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
21480 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
21490 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
214a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
214b0 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
214c0 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
214d0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
214e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
214f0 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
21500 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
21510 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
21520 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
21530 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
21540 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
21550 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
21560 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
21570 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
21580 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
21590 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
215a0 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
215b0 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
215c0 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
215d0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
215e0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
215f0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
21600 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
21610 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
21620 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
21630 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
21640 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
21650 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
21660 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
21670 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
21680 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
21690 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
216a0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
216b0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
216c0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
216d0 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
216e0 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
216f0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
21700 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
21710 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
21720 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
21730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21740 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
21750 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
21760 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
21770 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
21780 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
21790 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
217a0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  me permissions..
217b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
217c0 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c  sFstat(pDbFd->h,
217d0 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f   &sStat) && pIno
217e0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
217f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
21800 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
21810 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  STAT;.      goto
21820 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
21830 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
21840 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
21850 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
21860 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
21870 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21880 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20  ) + 31;.#else.  
21890 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
218a0 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   6 + (int)strlen
218b0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
218c0 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
218d0 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
218e0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53  lloc( sizeof(*pS
218f0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
21900 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
21910 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
21920 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21930 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
21940 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
21950 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
21960 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
21970 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
21980 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
21990 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
219a0 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
219b0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
219c0 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
219d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
219e0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
219f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21a00 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
21a10 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
21a40 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
21a50 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
21a80 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
21a90 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
21aa0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21ab0 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
21ac0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
21ad0 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
21ae0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
21af0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
21b00 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53  pDbFd->zPath, zS
21b10 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  hmFilename);.#en
21b20 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
21b30 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44  ->h = -1;.    pD
21b40 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
21b50 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
21b60 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
21b70 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
21b80 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  pInode;.    pShm
21b90 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
21ba0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
21bb0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
21bc0 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
21bd0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
21be0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
21bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21c00 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
21c10 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
21c20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
21c30 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
21c40 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
21c50 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
21c60 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66  _CREAT;.      if
21c70 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
21c80 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
21c90 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
21ca0 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  m", 0) ){.      
21cb0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
21cc0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
21cd0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
21ce0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
21cf0 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
21d00 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
21d10 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
21d20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61  openFlags, (sSta
21d30 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
21d40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
21d50 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
21d60 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
21d70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
21d80 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
21d90 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
21da0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
21db0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
21dc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
21dd0 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
21de0 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
21df0 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oot, make sure t
21e00 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65  hat the SHM file
21e10 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e  .      ** is own
21e20 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75  ed by the same u
21e30 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68  ser that owns th
21e40 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
21e50 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ase.  Otherwise,
21e60 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
21e70 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c  iginal owner wil
21e80 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
21e90 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20   connect..      
21ea0 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77  */.      osFchow
21eb0 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  n(pShmNode->h, s
21ec0 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
21ed0 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20  at.st_gid);.  . 
21ee0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
21ef0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
21f00 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
21f10 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
21f20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
21f30 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
21f40 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
21f50 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
21f60 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
21f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
21f80 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
21f90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
21fa0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
21fb0 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
21fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21fd0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
21fe0 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
21ff0 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
22000 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22010 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22020 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
22030 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
22040 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
22050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22070 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22080 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
22090 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
220a0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
220b0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  MS, 1);.      }.
220c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
220d0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
220e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
220f0 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
22100 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
22110 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
22120 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
22130 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
22140 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22150 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
22160 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
22170 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
22180 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
22190 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
221a0 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
221b0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
221c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
221d0 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
221e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
221f0 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
22200 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
22210 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
22220 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
22230 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
22240 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
22250 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
22260 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
22270 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
22280 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
22290 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
222a0 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
222b0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
222c0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
222d0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
222e0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
222f0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
22300 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
22310 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
22320 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
22330 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
22340 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
22350 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
22360 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
22370 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
22380 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
22390 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
223a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
223b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
223c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
223d0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
223e0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
223f0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
22400 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
22410 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
22420 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
22430 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
22440 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
22450 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
22460 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
22470 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22480 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
22490 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
224a0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
224b0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
224c0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
224d0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
224e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
224f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22500 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
22510 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
22520 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
22530 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
22540 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
22550 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
22560 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
22570 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
22580 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22590 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
225a0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
225b0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
225c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
225d0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
225e0 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
225f0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
22600 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
22610 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
22620 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
22630 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
22640 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
22650 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
22660 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
22670 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
22680 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
22690 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
226a0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
226b0 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
226c0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
226d0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
226e0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
226f0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
22700 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
22710 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
22720 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
22730 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
22740 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
22750 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
22760 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
22770 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
22780 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
22790 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
227a0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
227b0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
227c0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
227d0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
227e0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
227f0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
22800 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
22810 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
22820 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
22830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
22840 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
22850 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22870 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
22880 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22890 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
228c0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
228d0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228f0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
22900 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
22910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22920 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
22930 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
22940 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
22950 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22970 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
22980 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
22990 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
229a0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
229b0 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
229c0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
229d0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
229e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
229f0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
22a00 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
22a10 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
22a20 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
22a30 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
22a40 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
22a50 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
22a60 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
22a70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22a80 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22a90 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
22aa0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
22ab0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
22ac0 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
22ad0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
22ae0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
22af0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
22b00 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
22b10 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
22b20 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
22b30 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
22b40 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
22b50 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
22b60 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
22b70 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
22b80 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
22b90 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
22ba0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
22bb0 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
22bc0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
22bd0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
22be0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
22bf0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
22c00 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
22c30 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
22c40 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
22c50 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
22c60 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
22c70 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
22c80 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
22c90 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22cb0 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
22cc0 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
22cd0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
22ce0 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
22cf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
22d00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
22d10 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
22d20 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
22d30 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
22d40 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
22d50 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
22d60 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
22d70 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
22d80 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
22d90 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
22da0 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
22db0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
22dc0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
22dd0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
22de0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
22df0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
22e00 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
22e10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
22e20 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
22e30 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
22e40 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
22e50 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
22e60 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
22e70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22e80 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
22e90 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
22ea0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
22eb0 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
22ec0 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
22ed0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
22ee0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
22ef0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
22f00 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
22f10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22f20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
22f30 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
22f40 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
22f50 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
22f60 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
22f70 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
22f80 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
22f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
22fa0 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74  ( !bExtend ) got
22fb0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23  o shmpage_out;.#
22fc0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
22fd0 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
22fe0 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
22ff0 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20  ALLOCATE.       
23000 20 69 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65   if( osFallocate
23010 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
23020 74 61 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79  tat.st_size, nBy
23030 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)!=0 ){.      
23040 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23050 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23060 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c  RR_SHMSIZE, "fal
23070 6c 6f 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  locate",.       
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
230a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
230b0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
230c0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
230d0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
230e0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
230f0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
23100 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
23110 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
23120 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
23130 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74  ERR_SHMSIZE, "ft
23140 72 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20  runcate",.      
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23170 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
23180 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
23190 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
231a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
231b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
231c0 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
231d0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
231e0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
231f0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
23200 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
23210 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
23220 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
23230 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
23240 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
23250 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  1)*sizeof(char *
23260 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
23270 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
23280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
23290 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
232a0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
232b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
232c0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
232d0 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
232e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  e(pShmNode->nReg
232f0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20  ion<=iRegion){. 
23300 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
23310 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
23320 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
23330 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70       pMem = mmap
23340 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20  (0, szRegion,.  
23350 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
23360 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
23370 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
23380 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
23390 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
233a0 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
233b0 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f  Node->h, szRegio
233c0 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d  n*(i64)pShmNode-
233d0 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20  >nRegion.       
233e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
233f0 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pMem==MAP_FAILED
23400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23410 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
23420 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
23430 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68  MAP, "mmap", pSh
23440 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
23450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
23460 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
23470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
23490 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  em = sqlite3_mal
234a0 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  loc(szRegion);. 
234b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
234c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
234d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
234e0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
234f0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
23500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23510 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
23520 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
23530 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f    }.      pShmNo
23540 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
23550 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20  mNode->nRegion] 
23560 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53  = pMem;.      pS
23570 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
23580 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
23590 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
235a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
235b0 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
235c0 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
235d0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
235e0 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
235f0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
23600 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
23610 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
23620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
23630 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
23640 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
23650 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
23660 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
23670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23680 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
23690 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
236a0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
236b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
236c0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
236d0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
236e0 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
236f0 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
23700 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
23710 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
23720 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
23730 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
23740 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
23750 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
23760 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
23770 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
23780 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
23790 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
237a0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
237b0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
237c0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
237d0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
237e0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
237f0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
23800 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
23810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
23820 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
23830 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
23840 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
23850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23860 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
23870 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
23880 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
238b0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
238c0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
238d0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
238e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
238f0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
23900 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
23910 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
23920 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
23930 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
23940 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
23950 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
23960 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
23970 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
23980 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
23990 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
239a0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
239b0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
239e0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
239f0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
23a00 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
23a10 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
23a20 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
23a30 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
23a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
23a70 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23aa0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
23ab0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
23ac0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23ad0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
23ae0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
23af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23b00 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
23b10 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
23b20 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
23b30 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
23b40 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
23b50 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
23b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
23b70 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
23b80 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
23b90 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
23ba0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
23bb0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
23bc0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
23bd0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
23be0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
23bf0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
23c00 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
23c10 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
23c20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
23c30 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
23c40 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
23c50 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
23c60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
23c70 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
23c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23c90 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
23ca0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23cb0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
23cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23cd0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
23ce0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23cf0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
23d00 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
23d10 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
23d20 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
23d30 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
23d40 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
23d50 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23d60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23d70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
23d80 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
23d90 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
23da0 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
23db0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
23dc0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
23dd0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
23de0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
23df0 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
23e00 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
23e10 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
23e20 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
23e30 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
23e40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23e50 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
23e60 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
23e70 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
23e80 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
23e90 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
23ea0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
23eb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
23ec0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
23ed0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
23ee0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
23ef0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
23f00 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
23f10 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
23f20 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  e, F_UNLCK, ofst
23f30 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
23f40 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
23f50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23f60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
23f70 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
23f80 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
23f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23fa0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
23fb0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
23fc0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
23fd0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
23fe0 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
23ff0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24000 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
24010 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
24020 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
24030 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
24040 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
24050 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
24060 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
24070 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
24080 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
24090 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
240a0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
240b0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
240c0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
240d0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
240e0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
240f0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
24100 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
24110 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
24120 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
24130 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
24140 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
24150 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
24160 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
24170 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
24180 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
24190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
241a0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
241b0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
241c0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
241d0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
241e0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
241f0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
24200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
24220 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
24230 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
24240 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
24250 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
24260 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  de, F_RDLCK, ofs
24270 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
24280 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
24290 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
242a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
242b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
242c0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
242d0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
242e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
242f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
24300 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
24310 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
24320 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
24330 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
24340 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
24350 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
24360 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
24370 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
24380 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
24390 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
243a0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
243b0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
243c0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
243d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
243e0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
243f0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
24400 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
24410 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
24420 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24430 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
24440 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24450 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
24460 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
24470 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
24480 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
24490 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
244a0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
244b0 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
244c0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
244d0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
244e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
244f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
24500 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
24510 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
24520 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  WRLCK, ofst+UNIX
24530 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
24540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24560 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
24570 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
24580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
24590 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
245a0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
245b0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
245c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
245d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
245e0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
245f0 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
24600 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
24610 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
24620 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
24630 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
24640 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
24650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24660 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
24670 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
24680 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
24690 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
246a0 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
246b0 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
246c0 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
246d0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
246e0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
246f0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
24700 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
24710 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
24720 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
24730 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
24740 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24760 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
24770 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24780 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
24790 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
247a0 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  (fd);.  unixEnte
247b0 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78  rMutex();.  unix
247c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
247d0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
247e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
247f0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
24800 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
24810 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
24820 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
24830 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
24840 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
24850 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
24860 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
24870 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
24880 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
24890 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
248a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
248b0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
248c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
248d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248e0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
248f0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
24900 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
24910 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
24920 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
24930 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
24940 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
24950 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24970 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
24980 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
24990 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
249a0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
249b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
249c0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
249d0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
249e0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
249f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24a00 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
24a10 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
24a20 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
24a30 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
24a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
24a50 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
24a60 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
24a70 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
24a80 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
24a90 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
24aa0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
24ab0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
24ac0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
24ad0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
24ae0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
24af0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
24b00 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24b10 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
24b20 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
24b30 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
24b40 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
24b50 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
24b60 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
24b70 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
24b80 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
24b90 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
24ba0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
24bb0 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
24bc0 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
24bd0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
24be0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
24bf0 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
24c00 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
24c10 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
24c20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
24c30 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
24c40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
24c50 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
24c60 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
24c70 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
24c80 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
24c90 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
24ca0 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
24cb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
24cc0 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
24cd0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
24ce0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
24cf0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
24d00 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
24d10 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
24d20 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
24d30 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
24d40 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
24d50 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   osUnlink(pShmNo
24d60 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
24d70 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
24d80 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
24d90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
24da0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
24db0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
24dc0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
24dd0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
24de0 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
24df0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
24e00 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
24e10 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
24e20 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
24e30 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
24e40 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
24e50 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 78 20  .** Arguments x 
24e60 61 6e 64 20 79 20 61 72 65 20 62 6f 74 68 20 69  and y are both i
24e70 6e 74 65 67 65 72 73 2e 20 41 72 67 75 6d 65 6e  ntegers. Argumen
24e80 74 20 79 20 6d 75 73 74 20 62 65 20 61 20 70 6f  t y must be a po
24e90 77 65 72 20 6f 66 20 32 2e 0a 2a 2a 20 52 6f 75  wer of 2..** Rou
24ea0 6e 64 20 78 20 75 70 20 74 6f 20 74 68 65 20 6e  nd x up to the n
24eb0 65 61 72 65 73 74 20 69 6e 74 65 67 65 72 20 6d  earest integer m
24ec0 75 6c 74 69 70 6c 65 20 6f 66 20 79 2e 20 46 6f  ultiple of y. Fo
24ed0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
24ee0 20 20 20 20 20 52 4f 55 4e 44 55 50 28 30 2c 20       ROUNDUP(0, 
24ef0 20 38 29 20 2d 3e 20 20 30 0a 2a 2a 20 20 20 20   8) ->  0.**    
24f00 20 52 4f 55 4e 44 55 50 28 31 33 2c 20 38 29 20   ROUNDUP(13, 8) 
24f10 2d 3e 20 31 36 0a 2a 2a 20 20 20 20 20 52 4f 55  -> 16.**     ROU
24f20 4e 44 55 50 28 33 32 2c 20 38 29 20 2d 3e 20 33  NDUP(32, 8) -> 3
24f30 32 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55  2.*/.#define ROU
24f40 4e 44 55 50 28 78 2c 79 29 20 20 20 20 20 28 28  NDUP(x,y)     ((
24f50 28 78 29 2b 79 2d 31 29 26 7e 28 79 2d 31 29 29  (x)+y-1)&~(y-1))
24f60 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ..static void un
24f70 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
24f80 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
24f90 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
24fa0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
24fb0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
24fc0 20 29 7b 0a 20 20 20 20 6d 75 6e 6d 61 70 28 70   ){.    munmap(p
24fd0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  Fd->pMapRegion, 
24fe0 70 46 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a  pFd->mmapOrigsiz
24ff0 65 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  e);.    pFd->pMa
25000 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
25010 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
25020 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
25030 70 4f 72 69 67 73 69 7a 65 20 3d 20 30 3b 0a 20  pOrigsize = 0;. 
25040 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
25050 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
25060 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
25070 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d  nByte){.  i64 nM
25080 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
25090 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
250a0 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
250b0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
250c0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
250d0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
250e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
250f0 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
25100 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
25110 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f  tbuf;          /
25120 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
25130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
25140 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
25150 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
25160 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
25170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25190 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
251a0 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73    }.    nMap = s
251b0 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a  tatbuf.st_size;.
251c0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
251d0 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20 29 7b  Fd->mmapLimit ){
251e0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
251f0 3e 6d 6d 61 70 4c 69 6d 69 74 3b 0a 20 20 7d 0a  >mmapLimit;.  }.
25200 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
25210 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
25220 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
25230 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
25240 70 46 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pFd);..    if( n
25250 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 76  Map>0 ){.      v
25260 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  oid *pNew;.     
25270 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f   int flags = PRO
25280 54 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 69 66  T_READ;.      if
25290 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
252a0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
252b0 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
252c0 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 20  |= PROT_WRITE;. 
252d0 20 20 20 20 20 70 4e 65 77 20 3d 20 6d 6d 61 70       pNew = mmap
252e0 28 30 2c 20 52 4f 55 4e 44 55 50 28 6e 4d 61 70  (0, ROUNDUP(nMap
252f0 2c 20 34 30 39 36 29 2c 20 66 6c 61 67 73 2c 20  , 4096), flags, 
25300 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 46 64 2d  MAP_SHARED, pFd-
25310 3e 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  >h, 0);.      if
25320 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
25330 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ED ){.        re
25340 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25350 52 5f 4d 52 45 4d 41 50 3b 0a 20 20 20 20 20 20  R_MREMAP;.      
25360 7d 0a 0a 20 20 20 20 20 20 70 46 64 2d 3e 70 4d  }..      pFd->pM
25370 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
25380 0a 20 20 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  .      pFd->mmap
25390 4f 72 69 67 73 69 7a 65 20 3d 20 70 46 64 2d 3e  Origsize = pFd->
253a0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
253b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
253c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
253d0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  }..static int un
253e0 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  ixFetch(sqlite3_
253f0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
25400 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
25410 69 64 20 2a 2a 70 70 29 7b 0a 20 20 75 6e 69 78  id **pp){.  unix
25420 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
25430 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
25440 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25460 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 69  .  *pp = 0;..  i
25470 66 28 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69  f( pFd->mmapLimi
25480 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  t>0 ){.    if( p
25490 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
254a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
254b0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
254c0 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
254d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
254e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
254f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
25500 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
25510 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
25520 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
25530 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
25540 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
25550 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
25560 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25580 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
25590 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
255a0 69 6c 65 20 2a 66 64 2c 20 76 6f 69 64 20 2a 70  ile *fd, void *p
255b0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
255c0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
255d0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
255e0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
255f0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
25600 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
25610 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
25620 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a   );..  if( p ){.
25630 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
25640 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
25650 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
25660 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
25670 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
25680 68 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72 65 74  hOut>=0 );.  ret
25690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
256a0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
256b0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
256c0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
256d0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
256e0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
256f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
25700 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
25710 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
25720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25730 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
25740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25780 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
25790 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
257a0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
257b0 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
257c0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
257d0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
257e0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
257f0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
25800 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
25810 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
25820 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
25830 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
25840 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
25850 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
25860 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
25870 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25880 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
25890 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
258a0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
258b0 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
258c0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
258d0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
258e0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
258f0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
25900 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
25910 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
25920 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
25930 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
25940 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
25950 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
25960 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
25970 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
25980 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
25990 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
259a0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
259b0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
259c0 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
259d0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
259e0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
259f0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
25a00 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
25a10 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
25a20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
25a30 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
25a40 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
25a50 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
25a60 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
25a70 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
25a80 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
25a90 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
25aa0 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
25ab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
25ac0 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
25ad0 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
25ae0 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
25af0 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
25b00 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
25b10 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
25b20 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
25b30 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
25b40 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
25b50 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
25b60 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
25b70 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
25b80 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
25b90 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
25ba0 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
25bb0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
25bc0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
25bd0 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
25be0 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
25bf0 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
25c00 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
25c10 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
25c20 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
25c30 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
25c40 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
25c50 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
25c60 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
25c70 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
25c80 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
25c90 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
25ca0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
25cb0 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
25cc0 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
25cd0 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
25ce0 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
25cf0 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
25d00 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
25d10 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
25d20 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
25d30 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
25d40 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
25d50 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
25d60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
25d70 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e10 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25e40 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
25e90 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25eb0 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
25ee0 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f00 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
25f30 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f50 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25f80 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
25f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25fa0 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fc0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
25fd0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
25fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
25ff0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
26020 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
26030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
26040 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
26070 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
26080 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
26090 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
260a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
260b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
260c0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
260d0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
260e0 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
26110 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
26120 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
26130 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
26160 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
26170 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
26180 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
261b0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
261c0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
261d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
26200 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26210 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
26220 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
26250 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
26260 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
26270 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
262a0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
262b0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
262c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20  \.   unixFetch, 
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20   /* xFetch */   
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26330 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c  .   unixUnfetch,
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20  /* xUnfetch */  
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26380 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
263d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
263e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
263f0 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
26400 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
26410 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
26420 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26430 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
26440 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
26470 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
26510 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
26520 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
26530 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
26540 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
26550 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
26560 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
26570 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
26580 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
26590 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
265a0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
265b0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
265c0 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
265d0 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
265e0 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
265f0 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
26600 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
26610 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
26620 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
26630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26640 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
26650 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
26660 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
26670 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
26680 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
26690 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
266c0 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65  ory and mmap are
266d0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
266e0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
266f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
26700 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
26710 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
26720 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
26730 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
26740 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
26750 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
26760 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
26770 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
26780 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
26790 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
267a0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
267b0 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
267c0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
267d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
267e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
267f0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
26800 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
26810 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
26820 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
26830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26840 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
26850 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
26860 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
26870 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
26880 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
26890 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
268a0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
268b0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
268c0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
268d0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
268e0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
268f0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
26900 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
26910 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
26920 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
26930 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
26940 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
26950 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
26960 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
26970 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
26980 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
26990 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
269a0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
269b0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269d0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
269e0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
269f0 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
26a00 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
26a10 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
26a20 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
26a30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26a40 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
26a50 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
26a60 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
26a70 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
26a80 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
26a90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26aa0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
26ab0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
26ac0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
26ad0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
26ae0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
26af0 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
26b00 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
26b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26b20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
26b30 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
26b40 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
26b50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
26b60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
26b70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
26ba0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
26bb0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26bd0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
26be0 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
26c10 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
26c40 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
26c50 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
26c60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
26c70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
26c80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
26c90 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
26ca0 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
26cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26cc0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
26cd0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
26ce0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
26cf0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
26d00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
26d10 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
26d40 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
26d50 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
26d60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26d70 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
26d80 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
26d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26da0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
26db0 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
26dc0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
26dd0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
26de0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
26df0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
26e00 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
26e10 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
26e20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
26e30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
26e40 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
26e50 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
26e60 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
26e70 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
26e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
26e90 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
26ea0 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
26eb0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
26ec0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
26ed0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
26ee0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
26f10 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
26f20 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f40 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
26f50 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f70 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
26f80 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fa0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
26fb0 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
26fc0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
26fd0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
26fe0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
26ff0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
27000 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
27010 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
27020 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
27030 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
27040 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
27050 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
27060 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
27070 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
27080 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
27090 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
270a0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
270b0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
270c0 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
270d0 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
270e0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
270f0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
27100 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
27110 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
27120 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
27130 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
27140 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
27150 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
27160 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
27170 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
27180 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
27190 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
271a0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
271b0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
271c0 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
271d0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
271e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
271f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
27200 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
27210 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
27220 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
27230 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
27240 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
27250 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
27260 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
27270 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
27280 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
27290 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
272a0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
272b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
272c0 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
272d0 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
272e0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
272f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
27300 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
27310 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
27320 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
27330 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
27340 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
27350 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
27360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
27370 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
27380 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
27390 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
273a0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
273b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
273c0 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
273d0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
273e0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
273f0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
27400 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
27410 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
27420 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
27430 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
27440 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
27450 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
27460 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
27470 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
27480 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
27490 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
274a0 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
274b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
274c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
274d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
274e0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
274f0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27510 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
27520 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
27530 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
27540 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
27550 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27560 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
27590 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
275a0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
275b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
275c0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
275d0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
275e0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
275f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
27600 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
27610 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
27620 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
27630 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
27640 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
27650 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
27660 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
27670 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
27680 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
27690 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
276a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
276b0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
276c0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
276d0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
276e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
276f0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
27700 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
27710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
27720 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
27730 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
27740 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27750 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
27760 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
27770 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
27780 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
27790 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
277a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
277b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
277c0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
277d0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
277e0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
277f0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
27800 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
27810 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
27820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
27830 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
27840 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
27850 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
27860 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
27870 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
27880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
27890 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
278a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
278b0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
278c0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
278d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
278e0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
278f0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
27900 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
27910 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
27920 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
27930 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
27940 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
27950 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
27960 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
27970 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
27980 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
27990 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
279a0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
279b0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
279c0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
279d0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
279e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
279f0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
27a00 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
27a10 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
27a20 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
27a30 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
27a40 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
27a50 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
27a60 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
27a70 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
27a80 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
27a90 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
27aa0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
27ab0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
27ac0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
27ad0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
27ae0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
27af0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
27b00 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
27b10 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
27b20 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
27b30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
27b40 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
27b50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
27b60 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
27b70 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
27b80 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
27b90 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
27ba0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
27bb0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
27bc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
27bd0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
27be0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
27bf0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
27c00 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
27c10 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
27c20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
27c30 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
27c40 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
27c50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
27c60 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
27c70 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
27c80 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
27c90 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
27ca0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
27cb0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
27cc0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
27cd0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
27ce0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
27cf0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
27d00 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
27d10 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
27d20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
27d30 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
27d40 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
27d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
27d60 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
27d70 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
27d80 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
27d90 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
27da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
27db0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
27dc0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
27dd0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
27de0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
27df0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
27e00 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
27e10 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
27e20 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
27e30 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
27e40 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
27e50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
27e60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
27e70 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
27e80 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
27e90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27ea0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
27eb0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
27ec0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
27ed0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
27ee0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
27ef0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
27f00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27f10 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
27f20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
27f30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27f40 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
27f50 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
27f60 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
27f70 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
27f80 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
27f90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
27fa0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
27fb0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
27fc0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
27fd0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
27fe0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
27ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28000 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
28010 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
28020 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
28030 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
28040 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
28050 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
28060 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
28070 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
28080 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
28090 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
280a0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
280b0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
280c0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
280d0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
280e0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
280f0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
28100 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
28110 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
28120 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
28130 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
28140 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
28150 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
28160 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
28170 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
28180 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
28190 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
281a0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
281b0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
281c0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
281d0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
281e0 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
281f0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
28200 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
28210 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
28220 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
28230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
28240 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
28250 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
28260 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
28270 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
28280 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
28290 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
282a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
282b0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
282c0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
282d0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
282e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
282f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
28300 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
28310 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
28320 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
28330 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
28340 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
28350 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28360 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
28370 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
28380 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
28390 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
283a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
283f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
28400 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
28410 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
28420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
28430 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
28440 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
28450 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28460 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
28470 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
28480 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
28490 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
284a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
284b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
284c0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
284d0 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
284e0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
284f0 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
28500 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
28510 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
28520 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
28530 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
28540 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
28550 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
28560 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
28570 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
28580 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
28590 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
285a0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
285b0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
285c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
285d0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
285e0 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
285f0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  pened */.  int c
28600 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
28610 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
28620 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61  re UNIXFILE_* va
28630 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  lues */.){.  con
28640 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28650 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
28660 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
28670 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
28680 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
28690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
286a0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
286b0 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
286c0 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
286d0 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
286e0 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
286f0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
28700 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
28710 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
28720 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
28730 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
28740 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
28750 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
28760 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
28770 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
28780 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
28790 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
287a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
287b0 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
287c0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
287d0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
287e0 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
287f0 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
28800 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
28810 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
28820 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
28830 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
28840 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
28850 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63  dif..  /* No loc
28860 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
28870 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
28880 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
28890 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
288a0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
288b0 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
288c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
288d0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
288e0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
288f0 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
28900 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
28910 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
28920 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
28930 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
28940 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
28950 73 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  s;.  if( sqlite3
28960 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
28970 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
28980 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
28990 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
289c0 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
289d0 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
289e0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
289f0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
28a00 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
28a10 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
28a20 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
28a30 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
28a40 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
28a50 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
28a60 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
28a70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
28a80 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
28a90 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
28aa0 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
28ab0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
28ac0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
28ad0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
28ae0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
28af0 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
28b00 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
28b10 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
28b20 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
28b30 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
28b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
28b50 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
28b60 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
28b70 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
28b80 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
28b90 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
28ba0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
28bb0 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
28bc0 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
28bd0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
28be0 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
28bf0 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
28c00 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
28c10 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
28c20 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
28c30 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
28c40 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
28c50 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
28c60 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
28c70 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
28c80 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
28c90 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
28ca0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
28cb0 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
28cc0 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
28cd0 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
28ce0 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
28cf0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
28d00 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
28d10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
28d20 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
28d30 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
28d40 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
28d50 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
28d60 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
28d70 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
28d80 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
28d90 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
28da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28db0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
28dc0 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
28dd0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
28de0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
28df0 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
28e00 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
28e10 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
28e20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
28e30 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
28e40 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
28e50 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
28e60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
28e70 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
28e80 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
28e90 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
28ea0 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
28eb0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
28ec0 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
28ed0 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
28ee0 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
28ef0 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
28f00 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
28f10 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
28f20 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
28f30 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
28f40 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
28f50 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
28f60 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
28f70 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
28f80 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
28f90 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
28fa0 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
28fb0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
28fc0 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
28fd0 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
28fe0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
28ff0 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
29000 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
29010 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
29020 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
29030 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
29040 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
29050 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
29060 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
29070 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
29080 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
29090 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
290a0 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
290b0 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
290c0 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
290d0 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
290e0 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
290f0 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
29100 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
29110 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
29120 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
29130 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
29140 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
29150 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
29160 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
29170 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
29180 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
29190 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
291a0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
291b0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
291c0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
291d0 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
291e0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
291f0 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
29200 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
29210 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
29220 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
29230 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
29240 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
29250 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
29260 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
29270 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
29280 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
29290 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
292a0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
292b0 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
292c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
292d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
292e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
292f0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
29300 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
29310 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
29320 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
29330 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
29340 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
29350 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
29360 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
29370 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
29380 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
29390 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
293a0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
293b0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
293c0 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
293d0 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
293e0 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
293f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
29400 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
29410 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
29420 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
29430 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29460 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
29470 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
29480 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
29490 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
294a0 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
294b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
294c0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
294d0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
294e0 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
294f0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
29500 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
29510 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
29520 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
29530 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
29540 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
29550 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
29560 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
29570 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
29580 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
29590 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
295a0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
295b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
295c0 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
295d0 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
295e0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
295f0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
29600 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
29610 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
29620 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
29630 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
29640 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
29650 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29670 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29680 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
29690 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
296a0 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
296b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
296c0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
296d0 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
296e0 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
296f0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
29700 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
29710 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
29720 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
29730 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
29740 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
29750 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
29760 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
29770 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
29780 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
29790 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
297a0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
297b0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
297c0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
297d0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
297e0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
297f0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
29800 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
29810 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
29820 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
29830 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
29840 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
29850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
29860 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
29870 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
29880 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
298b0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
298c0 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
298d0 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
298e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
298f0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
29900 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
29910 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
29920 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
29930 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
29940 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
29950 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
29960 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
29970 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
29980 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
29990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
299a0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
299b0 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
299c0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
299d0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
299e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
299f0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
29a00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
29a10 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
29a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29a30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
29a40 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
29a50 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
29a60 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
29a70 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
29a80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
29a90 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
29aa0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
29ab0 29 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67  ) pNew->ctrlFlag
29ac0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
29ad0 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69  LETE;.#endif.  i
29ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29af0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
29b00 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
29b10 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
29b20 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
29b30 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
29b40 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
29b50 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
29b60 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
29b70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29b80 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
29b90 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
29ba0 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
29bb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
29bc0 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
29bd0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
29be0 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
29bf0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
29c00 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
29c10 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
29c20 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
29c30 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
29c40 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
29c50 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
29c60 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
29c70 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
29c80 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
29c90 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
29ca0 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
29cb0 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
29cc0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
29cd0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
29ce0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29cf0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
29d00 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
29d10 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
29d20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
29d30 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
29d40 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
29d50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
29d60 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
29d70 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
29d80 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
29d90 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
29da0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
29db0 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
29dc0 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
29dd0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
29de0 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
29df0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
29e00 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
29e10 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
29e20 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
29e30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
29e40 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
29e50 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
29e60 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
29e70 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
29e80 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
29e90 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
29ea0 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
29eb0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
29ec0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
29ed0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29ee0 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
29ef0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
29f00 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
29f10 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
29f20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
29f30 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
29f40 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
29f50 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
29f60 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
29f70 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
29f80 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
29f90 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
29fa0 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
29fb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
29fc0 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
29fd0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
29fe0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
29ff0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2a000 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2a010 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2a020 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2a030 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2a040 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2a050 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2a060 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
2a070 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2a080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2a090 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
2a0a0 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2a0b0 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
2a0c0 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
2a0d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2a0e0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2a0f0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
2a100 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
2a110 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
2a120 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
2a130 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
2a140 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
2a150 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
2a160 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
2a170 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2a180 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69  IX) + 18) >= (si
2a190 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
2a1a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a1b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
2a1c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2a1d0 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
2a1e0 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
2a1f0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2a200 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
2a210 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
2a220 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
2a230 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
2a240 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
2a250 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
2a260 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
2a270 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
2a280 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
2a290 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
2a2a0 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
2a2b0 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
2a2c0 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
2a2d0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
2a2e0 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
2a2f0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
2a300 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a310 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
2a320 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a330 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2a340 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
2a350 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
2a360 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
2a370 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
2a380 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
2a390 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
2a3a0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
2a3b0 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
2a3c0 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
2a3d0 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
2a3e0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2a3f0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
2a400 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2a410 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
2a420 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
2a430 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
2a440 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
2a450 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
2a460 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2a470 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
2a480 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
2a490 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
2a4a0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
2a4b0 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
2a4c0 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
2a4d0 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
2a4e0 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
2a4f0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
2a500 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
2a510 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2a520 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
2a530 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2a540 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
2a550 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a560 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
2a570 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2a580 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
2a590 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
2a5a0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
2a5b0 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
2a5c0 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
2a5d0 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
2a5e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2a5f0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2a600 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
2a610 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
2a620 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
2a630 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
2a640 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
2a650 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
2a660 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
2a670 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
2a680 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
2a690 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
2a6a0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
2a6b0 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
2a6c0 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
2a6d0 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
2a6e0 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
2a6f0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
2a700 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
2a710 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
2a720 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
2a730 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
2a740 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2a750 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
2a760 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
2a770 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
2a780 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
2a790 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
2a7a0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2a7b0 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
2a7c0 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
2a7d0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2a7e0 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
2a7f0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
2a800 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
2a810 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
2a820 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
2a830 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
2a840 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
2a850 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
2a860 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
2a870 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
2a880 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
2a890 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
2a8a0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
2a8b0 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
2a8c0 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
2a8d0 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
2a8e0 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
2a8f0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
2a900 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2a910 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2a920 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
2a930 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
2a940 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
2a950 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
2a960 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
2a970 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
2a980 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
2a990 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
2a9a0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
2a9b0 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
2a9c0 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
2a9d0 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
2a9e0 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
2a9f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
2aa00 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
2aa10 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
2aa20 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
2aa30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2aa40 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
2aa50 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
2aa60 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
2aa70 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
2aa80 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
2aa90 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2aaa0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
2aab0 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
2aac0 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
2aad0 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
2aae0 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
2aaf0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
2ab00 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
2ab10 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
2ab20 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
2ab30 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
2ab40 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2ab50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
2ab60 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
2ab70 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
2ab80 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2ab90 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
2aba0 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
2abb0 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
2abc0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
2abd0 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
2abe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2abf0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
2ac00 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
2ac10 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
2ac20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
2ac30 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
2ac40 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
2ac50 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
2ac60 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
2ac70 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
2ac80 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
2ac90 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
2aca0 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
2acb0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
2acc0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
2acd0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
2ace0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
2acf0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
2ad00 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2ad10 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2ad20 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2ad30 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
2ad40 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
2ad50 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
2ad60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2ad70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2ad80 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
2ad90 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
2ada0 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
2adb0 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
2adc0 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
2add0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2ade0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
2adf0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
2ae00 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
2ae10 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
2ae20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
2ae30 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
2ae40 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
2ae50 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
2ae60 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
2ae70 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2ae80 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
2ae90 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2aea0 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
2aeb0 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
2aec0 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73  *.** In most cas
2aed0 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  es cases, this r
2aee0 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
2aef0 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
2af00 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
2af10 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
2af20 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
2af30 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
2af40 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
2af50 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2af60 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
2af70 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
2af80 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
2af90 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2afa0 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2afb0 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2afc0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2afd0 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2afe0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2aff0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2b000 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2b010 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2b020 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2b030 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2b040 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2b050 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2b060 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2b070 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2b080 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2b090 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2b0a0 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2b0b0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2b0c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2b0d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2b0e0 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2b0f0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2b100 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2b110 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2b120 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2b130 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2b140 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2b150 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2b160 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2b170 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2b180 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2b190 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2b1a0 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2b1b0 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2b1c0 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2b1d0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b1f0 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2b200 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2b210 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2b220 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2b230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b240 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2b250 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2b260 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2b270 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2b280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b290 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2b2a0 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2b2b0 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2b2c0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2b2d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2b2e0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2b2f0 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2b300 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2b310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2b320 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2b330 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2b340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b350 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2b360 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2b370 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
2b380 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
2b390 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
2b3a0 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2b3b0 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2b3c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2b3d0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
2b3e0 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
2b3f0 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
2b400 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
2b410 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b440 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
2b450 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
2b460 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2b480 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
2b490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2b4a0 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
2b4b0 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
2b4c0 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
2b4d0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
2b4e0 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
2b4f0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
2b500 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
2b510 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
2b520 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
2b530 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
2b540 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
2b550 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
2b560 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
2b570 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2b580 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
2b590 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2b5a0 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
2b5b0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2b5c0 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
2b5d0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2b5e0 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
2b5f0 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
2b600 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
2b610 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
2b620 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
2b630 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
2b640 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
2b650 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
2b660 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
2b670 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2b680 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
2b690 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2b6a0 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
2b6b0 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
2b6c0 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
2b6d0 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
2b6e0 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
2b6f0 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
2b700 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
2b710 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
2b720 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
2b730 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
2b740 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
2b750 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b760 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
2b770 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
2b780 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
2b790 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
2b7a0 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
2b7b0 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
2b7c0 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
2b7d0 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
2b7e0 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
2b7f0 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
2b800 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20  e & 0777;.      
2b810 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2b820 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69  _uid;.      *pGi
2b830 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
2b840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2b860 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
2b870 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
2b880 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2b890 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
2b8a0 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2b8b0 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0600;.  }.  retu
2b8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b8d0 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
2b8e0 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
2b8f0 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
2b900 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
2b910 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2b920 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
2b930 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
2b940 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2b950 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
2b960 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2b970 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
2b980 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2b990 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
2b9a0 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
2b9b0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
2b9c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
2b9d0 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
2b9e0 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
2b9f0 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
2ba00 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2ba10 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
2ba20 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
2ba30 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
2ba40 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
2ba50 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
2ba60 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
2ba70 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
2ba80 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
2ba90 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
2baa0 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
2bab0 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
2bac0 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
2bad0 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
2bae0 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
2baf0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
2bb00 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
2bb10 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
2bb20 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
2bb30 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
2bb40 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
2bb50 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
2bb60 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
2bb70 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
2bb80 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
2bb90 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
2bba0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
2bbb0 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
2bbc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2bbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2bbe0 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
2bbf0 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
2bc00 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
2bc10 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2bc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2bc30 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
2bc40 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
2bc50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2bc60 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
2bc70 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
2bc80 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
2bc90 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
2bca0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2bcb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
2bcc0 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
2bcd0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
2bce0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bd00 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
2bd10 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
2bd20 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
2bd30 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
2bd40 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
2bd50 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd70 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2bd80 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
2bd90 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2bda0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2bdc0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
2bdd0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
2bde0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2bdf0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
2be00 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2be10 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
2be20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2be30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2be40 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
2be50 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
2be60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2be70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2be80 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
2be90 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74  Code */.  int ct
2bea0 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  rlFlags = 0;    
2beb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58           /* UNIX
2bec0 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
2bed0 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
2bee0 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
2bef0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2bf00 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
2bf10 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
2bf20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2bf30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
2bf40 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
2bf50 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
2bf60 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2bf70 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
2bf80 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
2bf90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2bfa0 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
2bfb0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
2bfc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2bfd0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
2bfe0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2bff0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2c000 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
2c010 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2c020 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2c030 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
2c040 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c050 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2c060 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c070 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
2c080 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
2c090 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
2c0a0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
2c0b0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
2c0c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2c0d0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
2c0e0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
2c0f0 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
2c100 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
2c110 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
2c120 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
2c130 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
2c140 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
2c150 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
2c160 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
2c170 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
2c180 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
2c190 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
2c1a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2c1b0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2c1c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2c1d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2c1e0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2c1f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2c200 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
2c210 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
2c220 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
2c230 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
2c240 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
2c250 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
2c260 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
2c270 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
2c280 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
2c290 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
2c2a0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
2c2b0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
2c2c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2c2d0 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
2c2e0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
2c2f0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
2c300 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
2c310 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
2c320 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
2c330 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
2c340 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
2c350 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
2c360 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
2c370 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
2c380 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
2c390 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
2c3a0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
2c3b0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
2c3c0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2c3d0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2c3e0 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
2c3f0 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
2c400 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2c410 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2c420 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
2c430 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
2c440 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
2c450 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
2c460 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
2c470 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
2c480 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
2c490 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
2c4a0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
2c4b0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
2c4c0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
2c4d0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2c4e0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
2c4f0 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
2c500 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
2c510 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
2c520 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
2c530 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2c540 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
2c550 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
2c560 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
2c570 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2c580 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2c590 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2c5a0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
2c5b0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2c5c0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2c5d0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2c5e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2c5f0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2c600 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2c610 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2c620 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2c630 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2c640 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2c650 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2c660 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2c670 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
2c680 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
2c690 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
2c6a0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
2c6b0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
2c6c0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2c6d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2c6e0 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
2c6f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2c700 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
2c710 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2c720 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2c730 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2c740 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2c750 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2c760 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2c770 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
2c780 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2c790 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2c7a0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2c7b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2c7c0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
2c7d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2c7e0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
2c7f0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2c800 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2c810 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
2c820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2c830 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
2c840 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2c850 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
2c860 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
2c870 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
2c880 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2c890 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
2c8a0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
2c8b0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
2c8c0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2c8d0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
2c8e0 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
2c8f0 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2c900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c910 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2c920 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
2c930 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2c940 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ..    /* Databas
2c950 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
2c960 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2c970 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
2c980 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52  re not.    ** UR
2c990 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
2c9a0 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
2c9b0 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
2c9c0 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a  assed into.    *
2c9d0 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
2c9e0 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
2c9f0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
2ca00 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2ca10 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72  RI) || zName[str
2ca20 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
2ca30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28   );..  }else if(
2ca40 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
2ca50 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
2ca60 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
2ca70 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
2ca80 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
2ca90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
2caa0 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69  elete && !syncDi
2cab0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  r);.    rc = uni
2cac0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
2cad0 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d  _PATHNAME+2, zTm
2cae0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
2caf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cb00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2cb10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
2cb20 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
2cb30 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
2cb40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
2cb50 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
2cb60 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2cb70 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
2cb80 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
2cb90 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2cba0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2cbb0 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2cbc0 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
2cbd0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
2cbe0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2cbf0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2cc00 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
2cc10 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
2cc20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
2cc30 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
2cc40 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
2cc50 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
2cc60 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
2cc70 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
2cc80 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
2cc90 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
2cca0 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
2ccb0 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
2ccc0 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
2ccd0 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
2cce0 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
2ccf0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2cd00 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
2cd10 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
2cd20 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
2cd30 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
2cd40 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
2cd50 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
2cd60 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
2cd70 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
2cd80 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
2cd90 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
2cda0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
2cdb0 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
2cdc0 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
2cdd0 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
2cde0 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
2cdf0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
2ce00 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69  e with */.    ui
2ce10 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20  d_t uid;        
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2ce30 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69  serid for the fi
2ce40 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20  le */.    gid_t 
2ce50 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
2ce60 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70          /* Group
2ce70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2ce80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
2ce90 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
2cea0 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
2ceb0 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
2cec0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
2ced0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cee0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
2cef0 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
2cf00 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2cf10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2cf20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2cf30 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2cf40 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
2cf50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2cf60 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2cf70 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2cf80 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2cf90 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
2cfa0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
2cfb0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
2cfc0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
2cfd0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
2cfe0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
2cff0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
2d000 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
2d010 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
2d020 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
2d030 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2d040 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
2d050 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
2d060 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
2d070 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2d080 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2d090 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
2d0a0 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
2d0b0 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
2d0c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2d0d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2d0e0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2d0f0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
2d100 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
2d110 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
2d120 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2d130 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2d140 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
2d150 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
2d160 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2d170 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2d180 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
2d190 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
2d1a0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2d1b0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
2d1c0 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
2d1d0 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
2d1e0 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74  oot and if creat
2d1f0 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61  ing a new rollba
2d200 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
2d210 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73  l or WAL file, s
2d220 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70  et the ownership
2d230 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2d240 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20  or WAL to be.   
2d250 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20   ** the same as 
2d260 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
2d270 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
2d280 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2d290 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2d2a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2d2b0 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2d2c0 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75    osFchown(fd, u
2d2d0 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
2d2e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
2d2f0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
2d300 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
2d310 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
2d320 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
2d330 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
2d340 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
2d350 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
2d360 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
2d370 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
2d380 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
2d390 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
2d3a0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
2d3b0 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
2d3c0 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
2d3d0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
2d3e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d3f0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
2d400 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2d410 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
2d420 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
2d430 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2d440 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
2d450 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2d460 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2d470 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2d480 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
2d490 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
2d4a0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
2d4b0 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2d4c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2d4d0 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  no;.    robust_c
2d4e0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2d4f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2d500 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2d510 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2d520 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2d530 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2d540 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2d550 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2d560 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2d570 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2d580 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2d590 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
2d5a0 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
2d5b0 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
2d5c0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2d5e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2d5f0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
2d600 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2d620 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2d630 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  LE_RDONLY;.  if(
2d640 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
2d650 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2d660 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2d670 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
2d680 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
2d690 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2d6a0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2d6b0 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
2d6c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2d6d0 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
2d6e0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
2d6f0 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
2d700 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2d710 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
2d720 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2d730 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
2d740 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
2d750 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
2d760 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
2d770 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
2d780 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
2d790 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
2d7a0 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
2d7b0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2d7c0 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
2d7d0 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
2d7e0 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
2d7f0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2d800 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
2d810 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
2d820 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
2d830 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
2d840 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
2d850 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
2d860 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
2d870 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
2d880 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
2d890 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
2d8a0 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
2d8b0 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
2d8c0 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
2d8d0 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
2d8e0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
2d8f0 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
2d900 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
2d910 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
2d920 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
2d930 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
2d940 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
2d950 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2d960 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
2d970 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
2d980 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
2d990 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
2d9a0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
2d9b0 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
2d9c0 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
2d9d0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2d9e0 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
2d9f0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
2da00 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
2da10 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
2da20 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
2da30 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
2da40 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
2da50 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
2da60 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
2da70 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
2da80 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
2da90 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
2daa0 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
2dab0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
2dac0 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
2dad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
2dae0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2daf0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2db00 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2db10 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2db20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2db30 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
2db40 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2db50 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
2db60 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
2db70 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
2db80 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
2db90 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
2dba0 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
2dbb0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
2dbc0 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
2dbd0 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
2dbe0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
2dbf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dc00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
2dc10 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
2dc20 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
2dc30 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
2dc40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2dc50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dc60 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
2dc70 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
2dc80 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
2dc90 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
2dca0 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
2dcb0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
2dcc0 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
2dcd0 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
2dce0 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
2dcf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
2dd00 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
2dd10 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
2dd20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
2dd30 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
2dd40 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2dd50 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
2dd60 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
2dd70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2dd90 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2dda0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
2ddb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2ddc0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
2ddd0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
2dde0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
2ddf0 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
2de00 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
2de10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2de20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2de30 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
2de40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2de50 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2de60 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
2de70 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
2de80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
2de90 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
2dea0 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
2deb0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
2dec0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2ded0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
2dee0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
2def0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
2df00 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2df10 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
2df20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2df30 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2df40 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2df50 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
2df60 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
2df70 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
2df80 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2df90 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
2dfa0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
2dfb0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2dfc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dfd0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2dfe0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2dff0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2e000 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
2e010 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
2e020 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
2e030 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
2e040 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
2e050 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NT ){.      rc =
2e060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
2e070 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20  LETE_NOENT;.    
2e080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e090 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2e0a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2e0b0 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
2e0c0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2e0d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2e0e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2e0f0 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
2e100 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31  if( (dirSync & 1
2e110 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
2e120 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  fd;.    rc = osO
2e130 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
2e140 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
2e150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e160 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
2e170 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
2e180 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
2e190 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
2e1a0 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
2e1b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
2e1c0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2e1d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
2e1e0 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
2e1f0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
2e200 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
2e210 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
2e220 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
2e230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e240 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
2e250 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2e270 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
2e280 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
2e290 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f  e existance of o
2e2a0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
2e2b0 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
2e2c0 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
2e2d0 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
2e2e0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
2e2f0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2e300 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
2e310 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
2e320 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
2e330 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
2e340 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
2e350 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
2e360 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
2e370 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
2e380 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
2e390 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
2e3a0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2e3b0 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
2e3c0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2e3d0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2e3e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
2e3f0 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
2e400 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
2e410 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
2e420 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
2e430 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
2e440 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2e450 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2e460 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
2e470 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
2e480 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2e490 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
2e4a0 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
2e4b0 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
2e4c0 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
2e4d0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
2e4e0 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
2e4f0 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
2e500 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20  .){.  int amode 
2e510 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
2e520 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2e530 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2e540 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2e550 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2e560 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   );.  switch( fl
2e570 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
2e580 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2e590 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
2e5a0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
2e5b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2e5c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2e5d0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
2e5e0 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
2e5f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2e600 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2e610 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
2e620 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
2e630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2e640 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2e650 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
2e660 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
2e670 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
2e680 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a  ut = (osAccess(z
2e690 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
2e6a0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ;.  if( flags==S
2e6b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2e6c0 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20  STS && *pResOut 
2e6d0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
2e6e0 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20  at buf;.    if( 
2e6f0 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2e700 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
2e710 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _size==0 ){.    
2e720 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
2e730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e750 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
2e760 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
2e770 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
2e780 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
2e790 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
2e7a0 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
2e7b0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
2e7c0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
2e7d0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
2e7e0 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
2e7f0 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
2e800 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
2e810 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
2e820 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
2e830 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
2e840 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
2e850 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
2e860 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
2e870 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
2e880 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
2e890 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2e8a0 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
2e8b0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
2e8c0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2e8d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2e8e0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2e8f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2e900 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
2e910 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
2e920 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
2e930 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e950 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
2e960 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
2e970 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
2e980 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
2e990 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2e9a0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
2e9b0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2e9c0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2e9d0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2e9e0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2e9f0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2ea00 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2ea10 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2ea20 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2ea30 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2ea40 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2ea50 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
2ea60 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
2ea70 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
2ea80 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
2ea90 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
2eaa0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
2eab0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
2eac0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2ead0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
2eae0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
2eaf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
2eb00 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
2eb10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2eb20 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74  R(pVfs);..  zOut
2eb30 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
2eb40 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
2eb50 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
2eb60 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
2eb70 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
2eb80 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
2eb90 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
2eba0 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
2ebb0 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
2ebc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ebd0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2ebe0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2ebf0 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
2ec00 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  th);.    }.    n
2ec10 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
2ec20 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
2ec30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2ec40 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
2ec50 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
2ec60 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
2ec70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ec80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ec90 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2eca0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
2ecb0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
2ecc0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
2ecd0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
2ece0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
2ecf0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
2ed00 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
2ed10 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
2ed20 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
2ed30 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
2ed40 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
2ed50 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
2ed60 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
2ed70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
2ed80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2ed90 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2eda0 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
2edb0 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
2edc0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
2edd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
2ede0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
2edf0 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
2ee00 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
2ee10 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
2ee20 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
2ee30 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
2ee40 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
2ee50 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
2ee60 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
2ee70 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
2ee80 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
2ee90 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
2eea0 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
2eeb0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
2eec0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
2eed0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
2eee0 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
2eef0 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
2ef00 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
2ef10 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
2ef20 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2ef30 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
2ef40 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
2ef50 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
2ef60 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
2ef70 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2ef80 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
2ef90 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
2efa0 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
2efb0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
2efc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2efd0 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
2efe0 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
2eff0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
2f000 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
2f010 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
2f020 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2f030 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
2f040 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
2f050 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
2f060 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
2f070 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
2f080 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
2f090 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
2f0a0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
2f0b0 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
2f0c0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2f0d0 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
2f0e0 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
2f0f0 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
2f100 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
2f110 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
2f120 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2f130 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
2f140 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
2f150 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
2f160 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
2f170 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
2f180 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
2f190 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
2f1a0 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
2f1b0 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
2f1c0 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
2f1d0 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
2f1e0 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
2f1f0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
2f200 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
2f210 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
2f220 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
2f230 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
2f240 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
2f250 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
2f260 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
2f270 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
2f280 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
2f290 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
2f2a0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
2f2b0 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
2f2c0 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
2f2d0 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
2f2e0 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
2f2f0 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
2f300 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
2f310 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
2f320 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
2f330 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
2f340 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
2f350 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
2f360 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
2f370 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
2f380 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
2f390 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
2f3a0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
2f3b0 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
2f3c0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
2f3d0 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
2f3e0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2f3f0 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
2f400 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
2f410 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
2f420 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
2f430 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
2f440 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
2f450 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
2f460 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
2f470 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
2f480 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f490 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
2f4a0 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
2f4b0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
2f4c0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2f4d0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
2f4e0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
2f4f0 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
2f500 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
2f510 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
2f520 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
2f530 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
2f540 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
2f550 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
2f560 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
2f570 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
2f580 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
2f590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2f5a0 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
2f5b0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2f5c0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
2f5d0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
2f5e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2f5f0 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
2f600 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
2f610 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
2f620 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
2f630 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
2f640 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
2f650 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
2f660 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
2f670 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
2f680 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
2f690 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
2f6a0 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
2f6b0 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
2f6c0 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
2f6d0 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
2f6e0 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
2f6f0 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
2f700 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
2f710 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
2f720 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
2f730 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
2f740 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
2f750 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
2f760 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
2f770 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
2f780 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
2f790 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
2f7a0 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
2f7b0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
2f7c0 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
2f7d0 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
2f7e0 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
2f7f0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
2f800 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
2f810 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
2f820 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
2f830 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
2f840 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
2f850 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
2f860 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
2f870 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
2f880 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
2f890 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
2f8a0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
2f8b0 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
2f8c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2f8d0 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
2f8e0 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20  pid, fd, got;.  
2f8f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2f900 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
2f910 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
2f920 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2f930 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
2f940 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
2f950 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
2f960 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
2f970 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
2f980 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
2f990 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
2f9a0 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
2f9b0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
2f9c0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
2f9d0 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
2f9e0 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
2f9f0 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
2fa00 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
2fa10 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
2fa20 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74  e{.      do{ got
2fa30 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
2fa40 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
2fa50 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
2fa60 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
2fa70 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2fa80 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2fa90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2faa0 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
2fab0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2fac0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2fad0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2fae0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2faf0 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
2fb00 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
2fb10 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
2fb20 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
2fb30 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
2fb40 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2fb50 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
2fb60 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
2fb70 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
2fb80 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
2fb90 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
2fba0 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
2fbb0 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
2fbc0 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
2fbd0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2fbe0 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
2fbf0 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
2fc00 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
2fc10 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2fc20 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
2fc30 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2fc40 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
2fc50 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
2fc60 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
2fc70 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
2fc80 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
2fc90 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
2fca0 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
2fcb0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
2fcc0 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
2fcd0 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
2fce0 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
2fcf0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2fd00 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2fd10 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
2fd20 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
2fd30 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
2fd40 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
2fd50 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
2fd60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2fd70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2fd80 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
2fd90 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
2fda0 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
2fdb0 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
2fdc0 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
2fdd0 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2fde0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2fdf0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
2fe00 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
2fe10 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
2fe20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2fe30 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2fe40 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2fe50 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2fe60 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2fe70 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2fe80 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2fe90 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2fea0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2feb0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2fec0 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2fed0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2fee0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2fef0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2ff00 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2ff10 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2ff20 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2ff30 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2ff40 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2ff50 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2ff60 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2ff70 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2ff80 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2ff90 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2ffa0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2ffb0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2ffc0 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2ffd0 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2ffe0 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2fff0 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
30000 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
30010 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
30020 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
30030 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
30040 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
30050 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
30060 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
30070 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
30080 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
30090 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
300a0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
300b0 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
300c0 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
300d0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
300e0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
300f0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
30100 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
30110 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
30120 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c  fs *NotUsed, sql
30130 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
30140 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  w){.  static con
30150 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
30160 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
30170 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
30180 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20  nt64)8640000;.  
30190 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
301a0 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
301b0 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
301c0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
301d0 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
301e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
301f0 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
30200 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
30210 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
30220 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
30230 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
30240 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
30250 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
30260 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
30270 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
30280 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
30290 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
302a0 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
302b0 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
302c0 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64    if( gettimeofd
302d0 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20  ay(&sNow, 0)==0 
302e0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
302f0 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
30300 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
30310 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
30320 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
30330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
30340 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
30350 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
30360 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
30370 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
30380 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
30390 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
303a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
303b0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
303c0 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
303d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
303e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
303f0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
30400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
30410 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
30420 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
30430 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
30440 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
30450 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
30460 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
30470 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
30480 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
30490 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
304a0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
304b0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
304c0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
304d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
304e0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
304f0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30500 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
30510 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
30520 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
30530 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
30540 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
30550 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
30560 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
30570 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
30580 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
30590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
305a0 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
305b0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
305c0 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
305d0 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
305e0 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
305f0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
30600 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
30610 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
30620 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
30630 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
30640 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
30650 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
30660 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
30670 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
30680 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
30690 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
306a0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
306b0 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
306c0 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
306d0 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
306e0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
306f0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
30700 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
30710 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
30720 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
30730 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
30740 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
30750 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
30760 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
30770 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30780 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
30790 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
307a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307b0 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
307c0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
307d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
307f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30830 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
30840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30880 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
30890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
308a0 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
308b0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
308c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
308d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
308e0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
308f0 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
30900 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
30910 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
30920 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
30930 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
30940 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
30950 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
30960 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
30970 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
30980 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
30990 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
309a0 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
309b0 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
309c0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
309d0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
309e0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
309f0 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
30a00 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
30a10 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
30a20 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
30a30 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
30a40 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
30a50 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
30a60 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
30a70 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
30a80 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
30a90 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
30aa0 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
30ab0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
30ac0 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
30ad0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
30ae0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
30af0 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
30b00 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
30b10 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
30b20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
30b30 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
30b40 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
30b50 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
30b60 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
30b70 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
30b80 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
30b90 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
30ba0 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
30bb0 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
30bc0 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
30bd0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
30be0 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
30bf0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
30c00 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
30c10 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
30c20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
30c30 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
30c40 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
30c50 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
30c60 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
30c70 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
30c80 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
30c90 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
30ca0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
30cb0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
30cc0 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
30cd0 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
30ce0 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
30cf0 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
30d00 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
30d10 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
30d20 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
30d30 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
30d40 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
30d50 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
30d60 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
30d70 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
30d80 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
30d90 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
30da0 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
30db0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
30dc0 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
30dd0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
30de0 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
30df0 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
30e00 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
30e10 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
30e20 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
30e30 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
30e40 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
30e50 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
30e60 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
30e70 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
30e80 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
30e90 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
30ea0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
30eb0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
30ec0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
30ed0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
30ee0 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
30ef0 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
30f00 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
30f10 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
30f20 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
30f30 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
30f40 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
30f50 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
30f60 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
30f70 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
30f80 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
30f90 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
30fa0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
30fb0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
30fc0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
30fd0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
30fe0 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
30ff0 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
31000 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
31010 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
31020 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
31030 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
31040 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
31050 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
31060 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
31070 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
31080 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
31090 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
310a0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
310b0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
310c0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
310d0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
310e0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
310f0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
31100 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
31110 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
31120 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
31130 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
31140 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
31150 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
31160 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
31170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
31180 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
31190 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
311a0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
311b0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
311c0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
311d0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
311e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
311f0 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
31200 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
31210 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
31220 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
31230 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
31240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31250 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
31260 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
31270 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
31280 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
31290 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
312a0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
312b0 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
312c0 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
312d0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
312e0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
312f0 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
31300 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
31310 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
31320 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
31330 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
31340 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
31350 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
31360 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
31370 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
31380 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
31390 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
313a0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
313b0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
313c0 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
313d0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
313e0 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
313f0 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
31400 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
31410 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
31420 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
31430 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
31440 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
31450 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
31460 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
31470 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
31480 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
31490 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
314a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
314b0 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
314c0 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
314d0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
314e0 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
314f0 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
31500 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
31510 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
31520 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
31530 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
31540 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
31550 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
31560 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
31570 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
31580 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
31590 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
315a0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
315b0 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
315c0 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
315d0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
315e0 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
315f0 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
31600 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
31610 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
31620 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
31630 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
31640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31650 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
31660 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
31670 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
31680 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
31690 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
316a0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
316b0 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
316c0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
316d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
316e0 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
316f0 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
31700 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
31710 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
31720 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
31730 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
31740 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
31750 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
31760 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
31770 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
31780 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
31790 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
317a0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
317b0 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
317c0 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
317d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
317e0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
317f0 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
31800 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
31810 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
31820 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
31830 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
31840 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
31850 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
31860 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
31870 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
31880 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
31890 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
318a0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
318b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
318c0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
318d0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
318e0 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
318f0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
31900 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
31910 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
31920 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
31930 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
31940 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
31950 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
31960 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
31970 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
31980 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
31990 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
319a0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
319b0 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
319c0 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
319d0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
319e0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
319f0 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
31a00 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
31a10 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
31a20 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
31a30 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
31a40 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
31a50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
31a60 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
31a70 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
31a80 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
31a90 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
31aa0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
31ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
31ac0 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
31ad0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
31ae0 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
31af0 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
31b00 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
31b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31b20 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
31b30 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
31b40 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
31b50 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
31b60 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
31b70 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
31b80 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
31b90 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
31ba0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
31bb0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
31bc0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
31bd0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
31be0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
31bf0 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
31c00 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
31c10 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
31c20 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
31c30 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
31c40 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
31c50 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
31c60 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
31c70 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
31c80 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
31c90 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
31ca0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
31cb0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
31cc0 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
31cd0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
31ce0 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
31cf0 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
31d00 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
31d10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
31d20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
31d30 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
31d40 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
31d50 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
31d60 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
31d70 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
31d80 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
31d90 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
31da0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
31db0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
31dc0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
31dd0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
31de0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
31df0 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
31e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e10 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
31e20 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
31e30 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
31e40 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
31e50 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
31e60 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
31e70 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
31e80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
31e90 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
31ea0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
31eb0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
31ec0 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
31ed0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
31ee0 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
31ef0 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
31f00 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
31f10 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
31f20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
31f30 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
31f40 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
31f50 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
31f60 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
31f70 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
31f80 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
31f90 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
31fa0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
31fb0 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
31fc0 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
31fd0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
31fe0 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
31ff0 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
32000 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
32010 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
32020 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
32030 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
32040 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
32050 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
32060 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
32070 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
32080 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
32090 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
320a0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
320b0 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
320c0 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
320d0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
320e0 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
320f0 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
32100 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
32110 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
32120 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
32130 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
32140 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
32150 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
32160 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
32170 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
32180 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
32190 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
321a0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
321b0 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
321c0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
321d0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
321e0 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
321f0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
32200 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
32210 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
32220 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
32230 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
32240 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
32250 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
32260 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
32270 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
32280 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
32290 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
322a0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
322b0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
322c0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
322d0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
322e0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
322f0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
32300 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
32310 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
32320 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
32330 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
32340 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
32350 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
32360 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
32370 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
32380 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
32390 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
323a0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
323b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
323c0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
323d0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
323e0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
323f0 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
32400 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
32410 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
32420 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
32430 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
32440 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
32450 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
32460 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
32470 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
32480 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
32490 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
324a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
324b0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
324c0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
324d0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
324e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
324f0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
32500 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
32510 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
32520 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
32530 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
32540 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
32550 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
32560 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
32570 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
32580 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
32590 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
325a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
325b0 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
325c0 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
325d0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
325e0 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
325f0 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
32600 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
32610 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
32620 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
32630 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
32640 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
32650 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
32660 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
32670 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
32680 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
32690 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
326a0 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
326b0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
326c0 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
326d0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
326e0 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
326f0 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
32700 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
32710 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
32720 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
32730 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
32740 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
32750 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
32760 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
32770 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
32780 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
32790 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
327a0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
327b0 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
327c0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
327d0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
327e0 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
327f0 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
32810 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
32820 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
32830 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
32840 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
32850 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
32860 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
32870 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
32880 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
32890 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
328a0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
328b0 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
328c0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
328d0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
328e0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
328f0 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
32900 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
32910 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
32920 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
32930 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
32940 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
32950 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
32960 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
32970 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
32980 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
32990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
329a0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
329b0 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
329c0 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
329d0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
329e0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
329f0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
32a00 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
32a10 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
32a20 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
32a30 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
32a40 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
32a50 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
32a60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32a70 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
32a80 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
32a90 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
32aa0 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
32ab0 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
32ac0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
32ad0 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
32ae0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
32af0 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
32b00 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
32b10 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
32b20 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
32b30 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
32b40 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
32b50 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
32b60 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
32b70 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
32b80 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
32b90 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
32ba0 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
32bb0 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
32bc0 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
32bd0 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
32be0 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
32bf0 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
32c00 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
32c10 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
32c20 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
32c30 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
32c40 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
32c50 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
32c60 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
32c70 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
32c80 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
32c90 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
32ca0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
32cb0 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
32cc0 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
32cd0 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
32ce0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
32cf0 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
32d00 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
32d10 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
32d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
32d30 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
32d40 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
32d50 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
32d60 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
32d70 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
32d80 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
32d90 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
32da0 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
32db0 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
32dc0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32de0 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
32df0 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
32e00 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
32e10 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
32e20 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
32e30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32e40 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
32e50 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
32e60 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
32e70 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
32e80 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
32e90 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
32ea0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
32eb0 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
32ec0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
32ed0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
32ee0 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
32ef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
32f00 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
32f10 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
32f20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
32f30 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
32f40 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
32f50 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
32f60 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
32f70 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
32f80 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
32f90 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
32fa0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
32fb0 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
32fc0 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
32fd0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
32fe0 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
32ff0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
33000 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
33010 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
33020 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
33030 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
33040 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
33050 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
33060 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
33070 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
33080 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
33090 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
330a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
330b0 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
330c0 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
330d0 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
330e0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
330f0 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
33100 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
33110 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
33120 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
33130 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
33140 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
33150 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
33160 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
33170 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
33180 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
33190 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
331a0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
331b0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
331c0 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
331d0 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
331e0 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
331f0 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
33200 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
33210 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
33220 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
33230 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
33240 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
33250 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
33260 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
33270 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
33280 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
33290 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
332a0 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
332b0 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
332c0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
332d0 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
332e0 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
332f0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
33300 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
33310 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
33320 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
33330 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
33340 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
33350 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
33360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33370 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
33380 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
33390 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
333a0 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
333b0 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
333c0 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
333d0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
333e0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  & errno==ENOENT 
333f0 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  && islockfile ){
33400 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79  .      if( proxy
33410 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70  CreateLockPath(p
33420 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  ath) == SQLITE_O
33430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20  K ){.        fd 
33440 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
33450 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
33460 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33470 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
33480 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
33490 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
334a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
334b0 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
334c0 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e  s, 0);.    terrn
334d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
334e0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
334f0 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
33500 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
33510 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
33520 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
33530 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
33540 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
33550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33560 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
33570 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
33580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
33590 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
335a0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
335b0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
335c0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
335d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
335e0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
335f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
33600 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
33610 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
33620 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
33630 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
33640 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
33650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
33660 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
33670 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
33680 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
33690 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
336a0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
336b0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
336c0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
336d0 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
336e0 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
336f0 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
33700 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
33710 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
33720 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
33730 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
33740 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
33750 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
33760 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
33770 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
33780 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
33790 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
337a0 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69  myVfs, fd, (sqli
337b0 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
337c0 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  path, 0);.  if( 
337d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
337e0 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
337f0 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
33800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
33810 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
33820 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c      .  robust_cl
33830 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f  ose(pNew, fd, __
33840 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74  LINE__);.  sqlit
33850 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
33860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
33870 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
33880 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
33890 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
338a0 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
338b0 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
338c0 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
338d0 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
338e0 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
338f0 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
33900 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
33910 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
33920 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
33930 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
33940 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20  ../* Not always 
33950 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68  defined in the h
33960 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67  eaders as it oug
33970 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65  ht to be */.exte
33980 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75  rn int gethostuu
33990 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f  id(uuid_t id, co
339a0 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
339b0 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20  pec *wait);../* 
339c0 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
339d0 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
339e0 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
339f0 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
33a00 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
33a10 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
33a20 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
33a30 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
33a40 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
33a50 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
33a60 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
33a70 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
33a80 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
33a90 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
33aa0 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
33ab0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
33ac0 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
33ad0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
33ae0 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
33af0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
33b00 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
33b10 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
33b20 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  50.  {.    stati
33b30 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  c const struct t
33b40 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
33b50 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
33b60 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
33b70 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
33b80 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
33b90 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
33ba0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
33bb0 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
33bc0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
33bd0 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
33be0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
33bf0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
33c00 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
33c10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33c20 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
33c30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33c40 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
33c50 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
33c60 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
33c70 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
33c80 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
33c90 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
33ca0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
33cb0 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
33cc0 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
33cd0 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
33ce0 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
33cf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
33d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33d10 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
33d20 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
33d30 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
33d40 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
33d50 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
33d60 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
33d70 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
33d80 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
33d90 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
33da0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
33db0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
33dc0 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
33dd0 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
33de0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
33df0 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
33e00 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
33e10 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
33e20 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
33e30 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
33e40 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
33e50 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
33e60 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
33e70 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
33e80 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
33e90 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
33ea0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
33eb0 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
33ec0 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
33ed0 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
33ee0 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
33ef0 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
33f00 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
33f10 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
33f20 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
33f30 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
33f40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
33f50 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
33f60 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
33f70 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
33f80 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
33f90 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
33fa0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
33fb0 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
33fc0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33fd0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
33fe0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33ff0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34000 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
34010 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
34020 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
34030 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
34040 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
34050 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
34060 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
34070 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
34080 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
34090 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
340a0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
340b0 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
340c0 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
340d0 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
340e0 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
340f0 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
34100 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
34110 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
34120 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
34130 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
34140 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
34150 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
34160 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
34170 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
34180 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
34190 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
341a0 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
341b0 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
341c0 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
341d0 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
341e0 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
341f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34200 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
34210 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
34220 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
34230 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
34240 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
34250 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
34260 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
34270 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
34280 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
34290 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
342a0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
342b0 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
342c0 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
342d0 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
342e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
342f0 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
34300 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
34310 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
34320 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
34330 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
34340 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
34350 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
34360 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
34370 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
34380 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
34390 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
343a0 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  CL), 0);.  if( f
343b0 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
343c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
343d0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
343e0 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
343f0 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
34400 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
34410 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
34420 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
34430 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
34440 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
34450 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
34460 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
34470 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
34480 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
34490 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
344a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
344b0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
344c0 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
344d0 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
344e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
344f0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
34500 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
34510 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
34520 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
34530 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
34540 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
34550 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
34560 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
34570 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
34580 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
34590 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
345a0 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
345b0 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
345c0 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
345d0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
345e0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
345f0 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
34600 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
34610 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
34620 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
34630 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
34640 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
34650 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
34660 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
34670 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
34680 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
34690 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
346a0 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
346b0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
346c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
346d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
346e0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
346f0 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
34700 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
34710 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
34720 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
34730 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
34740 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
34750 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
34760 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
34770 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
34780 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34790 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
347a0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
347b0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
347c0 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
347d0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
347e0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
347f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34800 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
34810 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
34820 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
34830 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  me;.  .  memset(
34840 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30  &conchModTime, 0
34850 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f  , sizeof(conchMo
34860 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a  dTime));.  do {.
34870 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
34880 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
34890 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
348a0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
348b0 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
348c0 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
348d0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
348e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
348f0 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
34900 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
34910 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
34920 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
34930 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
34940 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
34950 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
34960 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
34970 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
34980 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
34990 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
349a0 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
349b0 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
349c0 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
349d0 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
349e0 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
349f0 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
34a00 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
34a10 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
34a20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
34a30 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
34a40 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
34a50 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
34a60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
34a70 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
34a80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
34a90 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
34aa0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
34ab0 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
34ac0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
34ad0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
34ae0 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
34af0 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
34b00 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
34b10 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
34b20 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
34b30 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
34b40 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
34b50 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
34b60 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
34b70 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
34b80 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
34b90 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
34ba0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
34bb0 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
34bc0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
34bd0 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
34be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
34bf0 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
34c00 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
34c10 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
34c20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
34c30 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
34c40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
34c50 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
34c60 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
34c70 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
34c80 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
34c90 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
34ca0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
34cb0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
34cc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
34cd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
34ce0 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
34cf0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
34d00 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
34d10 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
34d20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
34d30 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
34d40 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
34d50 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
34d60 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
34d70 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
34d80 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
34d90 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
34da0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
34db0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
34dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
34dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
34de0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
34df0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
34e10 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
34e20 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
34e30 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
34e40 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
34e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34e60 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
34e70 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
34e80 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
34e90 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
34ea0 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
34eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
34ec0 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
34ed0 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
34ee0 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
34ef0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
34f00 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
34f10 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
34f20 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
34f30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34f40 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
34f50 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
34f60 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
34f70 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
34f80 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
34f90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
34fa0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
34fb0 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
34fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34fd0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
34fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
34ff0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
35000 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
35010 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
35020 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
35030 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35040 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
35050 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
35060 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20  & nTries<3 );.  
35070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35080 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f  ./* Takes the co
35090 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
350a0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
350b0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
350c0 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
350d0 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
350e0 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
350f0 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
35100 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
35110 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
35120 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
35130 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
35140 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
35150 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
35160 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
35170 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
35180 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
35190 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
351a0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
351b0 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
351c0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
351d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
351e0 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
351f0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
35200 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35210 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
35220 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35230 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35240 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
35250 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
35260 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld!=0 ){.    ret
35270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
35280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
35290 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
352a0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
352b0 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79  e;.    uuid_t my
352c0 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20  HostID;.    int 
352d0 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
352e0 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f  char readBuf[PRO
352f0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
35300 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61  .    char lockPa
35310 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
35320 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f      char *tempLo
35330 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
35340 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
35350 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63  TE_OK;.    int c
35360 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a  reateConch = 0;.
35370 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61      int hostIdMa
35380 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tch = 0;.    int
35390 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
353a0 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b    int tryOldLock
353b0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Path = 0;.    in
353c0 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61  t forceNewLockPa
353d0 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20  th = 0;.    .   
353e0 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
353f0 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
35400 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
35410 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
35420 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
35430 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
35440 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35450 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
35460 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72  tpid()));..    r
35470 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
35480 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45  ID(myHostID, &pE
35490 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rror);.    if( (
354a0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
354b0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
354c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
354d0 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
354e0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
354f0 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nch;.    }.    r
35500 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
35510 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
35520 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ID, SHARED_LOCK)
35530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35550 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
35560 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nch;.    }.    /
35570 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74  * read the exist
35580 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  ing conch file *
35590 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20  /.    readLen = 
355a0 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69  seekAndRead((uni
355b0 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  xFile*)conchFile
355c0 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52  , 0, readBuf, PR
355d0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29  OXY_MAXCONCHLEN)
355e0 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65  ;.    if( readLe
355f0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
35600 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45  I/O error: lastE
35610 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
35620 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20  AndRead */.     
35630 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
35640 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
35650 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
35660 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
35670 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
35680 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
35690 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
356a0 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
356b0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
356c0 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
356d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
356e0 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
356f0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
35700 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
35710 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
35720 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
35730 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
35740 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
35750 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ew .      ** con
35760 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  ch file. .      
35770 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43  */.      createC
35780 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  onch = 1;.    }.
35790 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f      /* if the ho
357a0 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e  st id matches an
357b0 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  d the lock path 
357c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
357d0 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20  n the conch.    
357e0 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20  ** we'll try to 
357f0 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65  use the path the
35800 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20  re, if we can't 
35810 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20  open that path, 
35820 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  we'll .    ** re
35830 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61  try with a new a
35840 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61  uto-generated pa
35850 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  th .    */.    d
35860 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  o { /* in case w
35870 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67  e need to try ag
35880 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f  ain for an :auto
35890 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c  : named lock fil
358a0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
358b0 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20  !createConch && 
358c0 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74  !forceNewLockPat
358d0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73  h ){.        hos
358e0 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63  tIdMatch = !memc
358f0 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58  mp(&readBuf[PROX
35900 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
35910 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20  HostID, .       
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35930 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59             PROXY
35940 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
35950 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
35960 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f  onch has data co
35970 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
35980 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
35990 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
359a0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
359b0 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
359c0 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
359d0 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
359e0 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
359f0 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
35a00 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
35a10 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
35a20 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
35a30 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20  y in there.     
35a40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35a50 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
35a60 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
35a70 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
35a80 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52   = (readLen - PR
35a90 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a  OXY_PATHINDEX);.
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
35ab0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74           if( pat
35ac0 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e  hLen>=MAXPATHLEN
35ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35ae0 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54    pathLen=MAXPAT
35af0 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20  HLEN-1;.        
35b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35b10 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74    memcpy(lockPat
35b20 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
35b30 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61  Y_PATHINDEX], pa
35b40 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  thLen);.        
35b50 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74      lockPath[pat
35b60 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  hLen] = 0;.     
35b70 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
35b80 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
35b90 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f              tryO
35ba0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ldLockPath = 1;.
35bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
35bc0 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
35bd0 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66  the lock path if
35be0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
35bf0 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
35c00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
35c10 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20  conch;.         
35c20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
35c30 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
35c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35c50 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78  && !strncmp(pCtx
35c60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
35c70 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
35c80 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20  PATHINDEX],.    
35c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ca0 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50         readLen-P
35cb0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a  ROXY_PATHINDEX).
35cc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
35cd0 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f       /* conch ho
35ce0 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68  st and lock path
35cf0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
35d00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
35d10 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20  econch; .       
35d20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35d30 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68   .      /* if th
35d40 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72  e conch isn't wr
35d50 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e  itable and doesn
35d60 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e  't match, we can
35d70 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20  't take it */.  
35d80 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69      if( (conchFi
35d90 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
35da0 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20  RDWR) == 0 ){.  
35db0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35dc0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
35dd0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
35de0 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
35df0 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68    .      /* eith
35e00 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64  er the conch did
35e10 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20  n't match or we 
35e20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
35e30 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20   new one */.    
35e40 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
35e50 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
35e60 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f        proxyGetLo
35e70 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50  ckPath(pCtx->dbP
35e80 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d  ath, lockPath, M
35e90 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
35ea0 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68      tempLockPath
35eb0 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20   = lockPath;.   
35ec0 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61       /* create a
35ed0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63   copy of the loc
35ee0 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66  k path _only_ if
35ef0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
35f00 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ken */.      }. 
35f10 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75       .      /* u
35f20 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68  pdate conch with
35f30 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28   host and path (
35f40 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69  this will fail i
35f50 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  f other process.
35f60 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73        ** has a s
35f70 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61  hared lock alrea
35f80 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74  dy), if the host
35f90 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65   id matches, use
35fa0 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a   the big.      *
35fb0 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a  * stick..      *
35fc0 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28  /.      futimes(
35fd0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55  conchFile->h, NU
35fe0 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  LL);.      if( h
35ff0 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63  ostIdMatch && !c
36000 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
36010 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46        if( conchF
36020 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63  ile->pInode && c
36030 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
36040 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
36050 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
36060 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
36070 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
36080 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
36090 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
360a0 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72        ** same pr
360b0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
360c0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
360d0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lock. */.       
360e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
360f0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
36100 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a  lse {          .
36110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
36120 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
36130 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45  ile, myHostID, E
36140 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
36170 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
36180 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
36190 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
361a0 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56  chFile, EXCLUSIV
361b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
361c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
361d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
361e0 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75      char writeBu
361f0 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  ffer[PROXY_MAXCO
36200 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
36210 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d   int writeSize =
36220 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   0;.        .   
36230 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72       writeBuffer
36240 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58  [0] = (char)PROX
36250 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a  Y_CONCHVERSION;.
36260 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
36270 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
36280 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
36290 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
362a0 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20  STIDLEN);.      
362b0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
362c0 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20  ProxyPath!=NULL 
362d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
362e0 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
362f0 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
36300 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  X], pCtx->lockPr
36310 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
36320 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LEN);.        }e
36330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
36340 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
36350 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
36360 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  DEX], tempLockPa
36370 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
36380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36390 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50     writeSize = P
363a0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b  ROXY_PATHINDEX +
363b0 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75   strlen(&writeBu
363c0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
363d0 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20  NDEX]);.        
363e0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
363f0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77  (conchFile->h, w
36400 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  riteSize);.     
36410 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74     rc = unixWrit
36420 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
36430 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69  *)conchFile, wri
36440 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53  teBuffer, writeS
36450 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
36460 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65   fsync(conchFile
36470 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ->h);.        /*
36480 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61   If we created a
36490 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20   new conch file 
364a0 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65  (not just update
364b0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
364c0 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a  f a .         **
364d0 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c   valid conch fil
364e0 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68  e), try to match
364f0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
36500 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36510 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20   .         */.  
36520 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36530 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74  LITE_OK && creat
36540 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20  eConch ){.      
36550 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
36560 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69  buf;.          i
36570 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74  nt err = osFstat
36580 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
36590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
365a0 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
365b0 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f        mode_t cmo
365c0 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65  de = buf.st_mode
365d0 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53  &(S_IRUSR|S_IWUS
365e0 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57  R | S_IRGRP|S_IW
365f0 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20  GRP |.          
36600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f                S_
36620 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a  IROTH|S_IWOTH);.
36630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
36640 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
36650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f  database file R/
36660 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69  W permissions, i
36670 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f  gnore failure */
36680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36690 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20  PROXY_DEBUG.    
366a0 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
366b0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
366c0 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  mode);.#else.   
366d0 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20           do{.   
366e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
366f0 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
36700 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20  le->h, cmode);. 
36710 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c             }whil
36720 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65  e( rc==(-1) && e
36730 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
36740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
36750 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
36760 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
36770 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
36780 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
36790 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
367a0 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20   FAILED with %d 
367b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
367c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f               cmo
367d0 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  de, code, strerr
367e0 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20  or(code));.     
367f0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
36810 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
36820 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45  chmod %o SUCCEDE
36830 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20  D\n",cmode);.   
36840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
36850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36860 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
36870 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
36880 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
36890 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c  derr, "STAT FAIL
368a0 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25  ED[%d] with %d %
368b0 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
368c0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20             err, 
368d0 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
368e0 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ode));.#endif.  
368f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36910 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
36920 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
36930 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
36940 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
36950 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  OCK);.      .   
36960 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a   end_takeconch:.
36970 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
36980 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53  TRANSPROXY: CLOS
36990 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  E  %d\n", pFile-
369a0 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >h));.      if( 
369b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
369c0 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
369d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  s ){.        int
369e0 20 66 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28   fd;.        if(
369f0 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
36a00 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74            robust
36a10 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46  _close(pFile, pF
36a20 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
36a30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36a40 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
36a50 2d 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20 3d  -1;.        fd =
36a60 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74   robust_open(pCt
36a70 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  x->dbPath, pFile
36a80 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  ->openFlags, 0);
36a90 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
36aa0 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f  (("TRANSPROXY: O
36ab0 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29  PEN  %d\n", fd))
36ac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64  ;.        if( fd
36ad0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
36ae0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
36af0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36b00 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49           rc=SQLI
36b10 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
36b20 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ; /* SQLITE_BUSY
36b30 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  ? proxyTakeConch
36b40 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20   called.        
36b50 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
36b60 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  g */.        }. 
36b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36b90 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
36ba0 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  xy ){.        ch
36bb0 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c  ar *path = tempL
36bc0 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f  ockPath ? tempLo
36bd0 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
36be0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
36bf0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
36c00 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
36c10 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b  ath, &pCtx->lock
36c20 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20  Proxy, 1);.     
36c30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36c40 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
36c50 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f  TE_NOMEM && tryO
36c60 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ldLockPath ){.  
36c70 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f          /* we co
36c80 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
36c90 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
36ca0 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c  e with the old l
36cb0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20  ock file path.  
36cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
36cd0 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74  ry again via aut
36ce0 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20  o-naming .      
36cf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
36d00 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61    forceNewLockPa
36d10 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
36d20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
36d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
36d40 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20  continue; /* go 
36d50 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b  back to the do {
36d60 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f  } while start po
36d70 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a  int, try again *
36d80 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
36d90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
36da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36db0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
36dc0 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
36dd0 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72   path if we extr
36de0 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a  acted the value.
36df0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
36e00 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
36e10 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20  or the path was 
36e20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
36e30 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20   stack.         
36e40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  */.        if( t
36e50 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  empLockPath ){. 
36e60 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
36e70 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
36e80 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
36e90 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b  , tempLockPath);
36ea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
36eb0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
36ec0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
36ed0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
36ee0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
36ef0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
36f00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
36f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36f20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
36f30 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  chHeld = 1;.    
36f40 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28      .        if(
36f50 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36f60 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
36f70 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
36f80 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69          afpLocki
36f90 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74  ngContext *afpCt
36fa0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  x;.          afp
36fb0 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
36fc0 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d  gContext *)pCtx-
36fd0 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b  >lockProxy->lock
36fe0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
36ff0 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62        afpCtx->db
37000 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
37010 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
37020 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
37030 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
37040 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37050 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
37060 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
37070 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  e, NO_LOCK);.   
37080 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
37090 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
370a0 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
370b0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
370c0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
370d0 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65  E_OK?"ok":"faile
370e0 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  d"));.      retu
370f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69  rn rc;.    } whi
37100 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61  le (1); /* in ca
37110 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  se we need to re
37120 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c  try the :auto: l
37130 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20  ock file - .    
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
37150 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  we should never 
37160 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20  get here except 
37170 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75  via the 'continu
37180 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a  e' call. */.  }.
37190 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
371a0 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
371b0 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
371c0 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
371d0 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
371e0 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
371f0 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
37200 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
37210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37220 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
37230 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
37240 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
37250 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
37260 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
37270 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
37280 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
37290 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
372a0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
372b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
372c0 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
372d0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
372e0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
372f0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37300 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
37310 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
37320 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
37330 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
37340 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
37350 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
37360 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
37370 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
37380 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
37390 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
373a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
373b0 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20  tpid()));.  if( 
373c0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
373d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  0 ){.    rc = co
373e0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
373f0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
37400 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
37410 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
37420 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  }.  pCtx->conchH
37430 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  eld = 0;.  OSTRA
37440 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
37450 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
37460 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
37470 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
37480 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
37490 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
374a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
374b0 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
374c0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
374d0 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
374e0 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
374f0 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
37500 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
37510 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
37520 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
37530 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
37540 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
37550 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
37560 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
37570 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
37580 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
37590 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
375a0 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
375b0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
375c0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
375d0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
375e0 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
375f0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
37600 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
37610 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
37620 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
37630 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
37640 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37650 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
37660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37670 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
37680 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
37690 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
376a0 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
376b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
376c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
376d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
376e0 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
376f0 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
37700 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
37710 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
37720 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
37730 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
37740 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
37750 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
37760 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
37770 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
37780 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
37790 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
377a0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
377b0 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
377c0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
377d0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
377e0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
377f0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
37800 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
37810 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
37820 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
37830 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
37840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37850 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
37860 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
37870 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
37880 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
37890 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
378a0 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
378b0 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
378c0 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
378d0 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
378e0 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
378f0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
37900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
37910 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
37920 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
37930 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
37940 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
37950 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
37960 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
37970 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
37980 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
37990 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
379a0 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
379b0 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
379c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
379d0 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
379e0 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
379f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
37a00 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
37a10 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
37a20 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
37a30 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
37a40 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
37a50 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
37a60 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
37a70 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
37a80 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
37a90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
37aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
37ab0 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
37ac0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37ad0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
37ae0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
37af0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
37b00 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
37b10 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
37b20 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
37b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
37b40 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
37b50 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
37b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37b70 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20  E_BUSY;.  }  .. 
37b80 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
37b90 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  o if the path is
37ba0 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72   NULL, :auto: or
37bb0 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69   matches the exi
37bc0 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20  sting path */.  
37bd0 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
37be0 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
37bf0 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
37c00 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c  to:") ||.    (ol
37c10 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d  dPath && !strncm
37c20 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c  p(oldPath, path,
37c30 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b   MAXPATHLEN)) ){
37c40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37c50 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
37c60 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
37c70 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
37c80 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70  lockProxy;.    p
37c90 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e  Ctx->lockProxy=N
37ca0 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63  ULL;.    pCtx->c
37cb0 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
37cc0 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21    if( lockProxy!
37cd0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
37ce0 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  c=lockProxy->pMe
37cf0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
37d00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63  lite3_file *)loc
37d10 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
37d20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37d30 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
37d40 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
37d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
37d60 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68  te3_free(oldPath
37d70 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  );.    pCtx->loc
37d80 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
37d90 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
37da0 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  path);.  }.  .  
37db0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37dc0 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66  .** pFile is a f
37dd0 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
37de0 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72  n opened by a pr
37df0 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20  ior xOpen call. 
37e00 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20   dbPath.** is a 
37e10 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74  string buffer at
37e20 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45   least MAXPATHLE
37e30 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69  N+1 characters i
37e40 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n size..**.** Th
37e50 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20  is routine find 
37e60 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  the filename ass
37e70 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69  ociated with pFi
37e80 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74  le and writes it
37e90 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a  .** int dbPath..
37ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37eb0 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
37ec0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
37ed0 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
37ee0 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69  bPath){.#if defi
37ef0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
37f00 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
37f10 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
37f20 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61  hods ){.    /* a
37f30 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61  fp style keeps a
37f40 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
37f50 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65  e db path in the
37f60 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20   filePath field 
37f70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
37f80 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73  truct */.    ass
37f90 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
37fa0 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
37fb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
37fc0 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
37fd0 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
37fe0 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  , ((afpLockingCo
37ff0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
38000 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
38010 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  dbPath, MAXPATHL
38020 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65  EN);.  } else.#e
38030 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
38040 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f  ->pMethod == &do
38050 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
38060 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63  {.    /* dot loc
38070 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65  k style uses the
38080 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
38090 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f   to store the do
380a0 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69  t lock.    ** fi
380b0 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
380c0 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  nt len = strlen(
380d0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
380e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d  ockingContext) -
380f0 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f   strlen(DOTLOCK_
38100 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d  SUFFIX);.    mem
38110 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
38120 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
38130 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b  ngContext, len +
38140 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
38150 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73    /* all other s
38160 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f  tyles use the lo
38170 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
38180 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69   store the db fi
38190 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61  le path */.    a
381a0 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63  ssert( strlen((c
381b0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
381c0 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
381d0 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
381e0 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
381f0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
38200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41  ckingContext, MA
38210 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20  XPATHLEN);.  }. 
38220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65  K;.}../*.** Take
38240 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c  s an already fil
38250 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65  led in unix file
38260 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73   and alters it s
38270 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69  o all file locki
38280 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70  ng .** will be p
38290 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
382a0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b  local proxy lock
382b0 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c   file.  The foll
382c0 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20  owing fields.** 
382d0 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e  are preserved in
382e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
382f0 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65  text so that the
38300 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
38310 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e  d and .** the un
38320 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f  ix structure pro
38330 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70  perly cleaned up
38340 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a   at close time:.
38350 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  **  ->lockingCon
38360 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68  text.**  ->pMeth
38370 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  od.*/.static int
38380 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
38390 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
383a0 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
383b0 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
383c0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
383d0 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72  xt *pCtx;.  char
383e0 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c   dbPath[MAXPATHL
383f0 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20  EN+1];       /* 
38400 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
38410 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
38420 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55  har *lockPath=NU
38430 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  LL;.  int rc = S
38440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
38450 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
38460 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
38470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
38480 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
38490 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
384a0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
384b0 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
384c0 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
384d0 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
384e0 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
384f0 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
38500 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
38510 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
38520 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
38530 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
38540 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
38550 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
38560 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
38570 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
38580 6f 63 6