/ Hex Artifact Content
Login

Artifact d37ec5f108f1369d15099ca3583d4e305226cac5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1a40: 20 75 6e 69 78 4d 61 70 70 69 6e 67 20 75 6e 69   unixMapping uni
1a50: 78 4d 61 70 70 69 6e 67 3b 0a 73 74 72 75 63 74  xMapping;.struct
1a60: 20 75 6e 69 78 4d 61 70 70 69 6e 67 20 7b 0a 20   unixMapping {. 
1a70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1a80: 6d 61 70 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  mapSize;.  sqlit
1a90: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f 72 69  e3_int64 mmapOri
1aa0: 67 73 69 7a 65 3b 0a 20 20 76 6f 69 64 20 2a 70  gsize;.  void *p
1ab0: 4d 61 70 52 65 67 69 6f 6e 3b 0a 7d 3b 0a 0a 0a  MapRegion;.};...
1ac0: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1ad0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1ae0: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1af0: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
1b00: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
1b10: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1b20: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
1b30: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
1b40: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
1b50: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1b60: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1b70: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1b80: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1b90: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1ba0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1bb0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1bd0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
1be0: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  is unixFile */. 
1bf0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1c00: 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
1c10: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f       /* Info abo
1c20: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
1c30: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
1c40: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1c70: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  riptor */.  unsi
1c80: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
1c90: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1ca0: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
1cb0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
1cc0: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
1cd0: 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c  d short int ctrl
1ce0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  Flags;       /* 
1cf0: 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e  Behavioral bits.
1d00: 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61    UNIXFILE_* fla
1d10: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  gs */.  int last
1d20: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d40: 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72  he unix errno fr
1d50: 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  om last I/O erro
1d60: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
1d70: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d90: 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63  cking style spec
1da0: 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20  ific state */.  
1db0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
1dc0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
1dd0: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1de0: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
1df0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e00: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20  r *zPath;       
1e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1e20: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
1e30: 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68  /.  unixShm *pSh
1e40: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1e50: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1e60: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1e70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1e80: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1eb0: 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55  red by FCNTL_CHU
1ec0: 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 20 20 69 6e 74  NK_SIZE */.  int
1ed0: 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20   nFetchOut;     
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1f00: 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1f10: 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74   refs */.  sqlit
1f20: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d  e3_int64 mmapLim
1f30: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  it;            /
1f40: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e  * Configured FCN
1f50: 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 20 76 61  TL_MMAP_LIMIT va
1f60: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  lue */.  int szS
1f70: 79 73 70 61 67 65 3b 20 20 20 20 20 20 20 20 20  yspage;         
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f90: 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  System page size
1fa0: 20 2a 2f 0a 20 20 75 6e 69 78 4d 61 70 70 69 6e   */.  unixMappin
1fb0: 67 20 61 4d 6d 61 70 5b 32 5d 3b 20 20 20 20 20  g aMmap[2];     
1fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 20            /* Up 
1fd0: 74 6f 20 74 77 6f 20 6d 65 6d 6f 72 79 20 6d 61  to two memory ma
1fe0: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  pped regions */.
1ff0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
2000: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
2010: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2020: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
2030: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
2040: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
2050: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
2060: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
2070: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
2080: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
2090: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
20a0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20b0: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
20c0: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
20f0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
2100: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
2110: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2120: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
2130: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2140: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
2150: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2160: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
2170: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
2180: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
2190: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
21a0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
21b0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
21c0: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
21d0: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
21e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21f0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
2200: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
2210: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
2220: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
2230: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
2240: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
2250: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
2260: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
2270: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
2280: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
2290: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
22a0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
22b0: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
22c0: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
22d0: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
22e0: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
22f0: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
2300: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
2310: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
2320: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
2330: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
2340: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
2350: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
2360: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
2370: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
2380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
2390: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
23a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
23b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
23c0: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
23d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
23e0: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
23f0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
2400: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
2410: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
2420: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
2430: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
2440: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
2450: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
2460: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
2470: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2480: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2490: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
24a0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
24c0: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
24d0: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
24e0: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
24f0: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2500: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2510: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
2520: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
2530: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
2540: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
2550: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
2560: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2570: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2580: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2590: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
25a0: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
25b0: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
25c0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
25d0: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
25e0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
25f0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2600: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2610: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
2620: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
2630: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
2640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2650: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
2660: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2670: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2680: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2690: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
26a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
26b0: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
26c0: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
26d0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
26e0: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
26f0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
2700: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
2710: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
2720: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
2730: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
2740: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
2750: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
2760: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2770: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2780: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2790: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
27a0: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
27b0: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
27c0: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
27d0: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
27e0: 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  king */../*.** I
27f0: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
2800: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
2810: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
2820: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
2830: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
2840: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
2850: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
2860: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
2870: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
2880: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2890: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
28a0: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
28b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
28c0: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
28d0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
28e0: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
28f0: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
2900: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
2910: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
2920: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
2930: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
2940: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
2950: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2960: 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f  e threadid macro
2970: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65   resolves to the
2980: 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f   thread-id or to
2990: 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a   0.  Used for.**
29a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
29b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
29c0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
29d0: 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68  DSAFE.#define th
29e0: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
29f0: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
2a00: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
2a10: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2a20: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
2a30: 20 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f   defined(_GNU_SO
2a40: 55 52 43 45 29 0a 23 20 64 65 66 69 6e 65 20 48  URCE).# define H
2a50: 41 56 45 5f 4d 52 45 4d 41 50 0a 23 65 6e 64 69  AVE_MREMAP.#endi
2a60: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65  f../*.** Differe
2a70: 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20  nt Unix systems 
2a80: 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69  declare open() i
2a90: 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  n different ways
2aa0: 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f  .  Same use.** o
2ab0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ac0: 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74  int,mode_t).  Ot
2ad0: 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f  hers use open(co
2ae0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e  nst char*,int,..
2af0: 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .)..** The diffe
2b00: 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61  rence is importa
2b10: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20  nt when using a 
2b20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
2b30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
2b40: 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f  he safest way to
2b50: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70   deal with the p
2b60: 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77  roblem is to alw
2b70: 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61  ays use this wra
2b80: 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c  pper.** which al
2b90: 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d  ways has the sam
2ba0: 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69  e well-defined i
2bb0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
2bc0: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65  tic int posixOpe
2bd0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
2be0: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20  ile, int flags, 
2bf0: 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74  int mode){.  ret
2c00: 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  urn open(zFile, 
2c10: 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a  flags, mode);.}.
2c20: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
2c30: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
2c40: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
2c50: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
2c60: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
2c70: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
2c80: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
2c90: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
2ca0: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
2cb0: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
2cc0: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
2cd0: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
2ce0: 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f  ic int posixFcho
2cf0: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
2d00: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
2d10: 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65 75  {.  return geteu
2d20: 69 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77  id() ? 0 : fchow
2d30: 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 7d  n(fd,uid,gid);.}
2d40: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2d50: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2d60: 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
2d70: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ry(const char*, 
2d80: 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  int*);../*.** Ma
2d90: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
2da0: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
2db0: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
2dc0: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
2dd0: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
2de0: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
2df0: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
2e00: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
2e10: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
2e20: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
2e30: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
2e40: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
2e50: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
2e60: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
2e70: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
2e80: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
2e90: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
2ea0: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
2eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2ec0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2ed0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
2ee0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2ef0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f00: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
2f10: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
2f20: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2f30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2f40: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2f50: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2f60: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2f70: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
2f80: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
2f90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2fa0: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
2fb0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
2fc0: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
2fd0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2fe0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
2ff0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3000: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
3010: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3020: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
3030: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3040: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
3050: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
3060: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
3070: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
3080: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3090: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
30a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
30b0: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
30c0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
30d0: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
30e0: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
30f0: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
3100: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3110: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
3120: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3130: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
3140: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
3150: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3160: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
3170: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
3180: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3190: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
31a0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
31b0: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
31c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
31d0: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
31e0: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
31f0: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
3200: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
3210: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
3220: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
3230: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
3240: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
3250: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
3260: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
3270: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
3280: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
3290: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
32a0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
32b0: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
32c0: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
32d0: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
32e0: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
32f0: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
3300: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
3310: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3320: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
3330: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3340: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
3350: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
3360: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
3370: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3380: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
3390: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33a0: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
33b0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
33c0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
33d0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
33e0: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
33f0: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
3400: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3410: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
3420: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
3430: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
3440: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
3450: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
3460: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
3470: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3480: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
3490: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
34a0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
34b0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
34c0: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
34d0: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
34e0: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
34f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3500: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
3510: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3520: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
3530: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3540: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3550: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
3560: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3570: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3590: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
35a0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
35b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
35c0: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
35d0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
35e0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
35f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3600: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3610: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3620: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
3630: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3640: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
3650: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3660: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3670: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
3680: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
3690: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
36a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
36b0: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
36c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
36d0: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
36e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
36f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3700: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3710: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
3720: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3730: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3740: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
3750: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3760: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
3770: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3780: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
3790: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
37a0: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
37b0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
37c0: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
37d0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
37e0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
37f0: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
3800: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
3810: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
3820: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3830: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3840: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
3850: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3860: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
3870: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3880: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3890: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
38a0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
38b0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
38c0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
38d0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
38e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38f0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
3900: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3910: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3920: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
3930: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3940: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3950: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
3960: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
3970: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
3980: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3990: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
39a0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
39b0: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
39c0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
39d0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
39e0: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3a00: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3a10: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3a20: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3a30: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3a40: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
3a50: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
3a60: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
3a70: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
3a80: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
3a90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
3aa0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3ab0: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3ac0: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3ad0: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3ae0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3af0: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
3b00: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
3b10: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
3b20: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3b30: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3b50: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3b60: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
3b70: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
3b80: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3b90: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
3ba0: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
3bb0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3bc0: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
3bd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3be0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
3bf0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c00: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3c10: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
3c20: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
3c30: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
3c40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
3c50: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
3c60: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3c70: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
3c80: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3c90: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
3ca0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
3cb0: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
3cc0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3cd0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3cf0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
3d00: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3d10: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
3d20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3d30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3d40: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
3d50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3d60: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
3d70: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3d80: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
3d90: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3da0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
3db0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3dc0: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
3dd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3de0: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
3df0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3e00: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
3e10: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
3e20: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
3e30: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3e40: 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20    { "mmap",     
3e50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e60: 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20  ll_ptr)mmap,    
3e70: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e80: 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  Mmap ((void*(*)(
3e90: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74  void*,size_t,int
3ea0: 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29  ,int,int,off_t))
3eb0: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
3ec0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e  rrent)..  { "mun
3ed0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
3ee0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ef0: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
3f00: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3f10: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
3f20: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
3f30: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
3f40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3f50: 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50  ined(HAVE_MREMAP
3f60: 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  ).  { "mremap", 
3f70: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3f80: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61  yscall_ptr)mrema
3f90: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
3fa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d  .#else.  { "mrem
3fb0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3fc0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3fd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fe0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3ff0: 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28  fine osMremap ((
4000: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
4010: 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74  ize_t,size_t,int
4020: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,...))aSyscall[2
4030: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  3].pCurrent)..};
4040: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
4050: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
4060: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
4070: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
4080: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
4090: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
40a0: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
40b0: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
40c0: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
40d0: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
40e0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
40f0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
4100: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
4110: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
4120: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
4130: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
4140: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
4150: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
4160: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
4170: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4180: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4190: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
41a0: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
41b0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
41c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
41e0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
41f0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
4200: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
4210: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
4220: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4230: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
4240: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
4250: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4260: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4270: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
4280: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4290: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
42a0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
42b0: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
42c0: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
42d0: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
42e0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
42f0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
4300: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
4310: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
4320: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4340: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4350: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4370: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
4380: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
4390: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
43a0: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
43b0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
43c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
43d0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
43e0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
43f0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
4400: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
4410: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
4420: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
4430: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4440: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4450: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4460: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4470: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4480: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4490: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
44a0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
44b0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
44c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
44d0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
44e0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
44f0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
4500: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
4510: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4520: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
4530: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
4540: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
4550: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
4560: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4570: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
4580: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
45b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
45c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
45d0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
45e0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
45f0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
4600: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
4610: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
4620: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
4630: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
4640: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
4650: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
4660: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
4670: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
4680: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
4690: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
46a0: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
46b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
46c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
46d0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
46e0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
46f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
4700: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4710: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4720: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
4730: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4740: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4750: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
4760: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4770: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
4780: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4790: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
47a0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
47b0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
47c0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
47d0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
47e0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
47f0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4800: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4810: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
4820: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
4830: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
4840: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
4850: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
4860: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
4870: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4880: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
4890: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
48a0: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
48b0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
48c0: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
48d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
48e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
48f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
4900: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4910: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
4920: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4930: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4940: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4950: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
4960: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
4970: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
4980: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
4990: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
49a0: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
49b0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
49c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
49d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
49e0: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
49f0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
4a00: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
4a10: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
4a20: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
4a30: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
4a40: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
4a50: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
4a60: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
4a70: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
4a80: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
4a90: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
4aa0: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
4ab0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
4ac0: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
4ad0: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
4ae0: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
4af0: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
4b00: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
4b10: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
4b20: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
4b30: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
4b40: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
4b50: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
4b60: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
4b70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
4b80: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
4b90: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
4ba0: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
4bb0: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
4bc0: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
4bd0: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
4be0: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
4bf0: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
4c00: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
4c10: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
4c20: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
4c30: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
4c40: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
4c50: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
4c60: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
4c70: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
4c80: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
4c90: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
4ca0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
4cb0: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
4cc0: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
4cd0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
4ce0: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
4cf0: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
4d00: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
4d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4d20: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
4d30: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
4d40: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
4d50: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
4d60: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
4d70: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
4d80: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 64 6f 7b 0a  MISSIONS;.  do{.
4d90: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
4da0: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
4db0: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
4dc0: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
4dd0: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
4de0: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
4df0: 20 20 7d 77 68 69 6c 65 28 20 66 64 3c 30 20 26    }while( fd<0 &
4e00: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
4e10: 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  ;.  if( fd>=0 ){
4e20: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
4e30: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
4e40: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
4e50: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
4e60: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
4e70: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
4e80: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
4e90: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
4ea0: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
4eb0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
4ec0: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
4ed0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4ee0: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
4ef0: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
4f00: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
4f10: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
4f20: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
4f30: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
4f40: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
4f50: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
4f60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
4f70: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
4f80: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
4f90: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
4fa0: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
4fb0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
4fc0: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
4fd0: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
4fe0: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
4ff0: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
5000: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
5010: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
5020: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
5030: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
5040: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
5050: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
5060: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
5070: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5080: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5090: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
50a0: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
50b0: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
50c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
50d0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
50e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
50f0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
5100: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
5110: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
5120: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
5130: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
5140: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
5150: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
5160: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5170: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5180: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5190: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
51a0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
51b0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
51c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
51d0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
51e0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
51f0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
5200: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5210: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5220: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
5230: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5240: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
5250: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
5260: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5270: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
5280: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5290: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
52a0: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
52b0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66  #endif...#if def
52c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
52d0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
52e0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
52f0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5300: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
5310: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
5320: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
5330: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
5340: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
5350: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
5360: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
5370: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
5380: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
5390: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
53a0: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
53b0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
53c0: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
53d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
53e0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
53f0: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
5400: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
5410: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
5420: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
5430: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
5440: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
5450: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
5460: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
5470: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
5480: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
5490: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
54a0: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
54b0: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
54c0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
54d0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
54e0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
54f0: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
5500: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
5510: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5520: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
5530: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
5540: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
5550: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
5560: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
5570: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
5580: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
5590: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
55a0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
55b0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
55c0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
55d0: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
55e0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
55f0: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
5600: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
5610: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
5620: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
5630: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
5640: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
5650: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
5660: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
5670: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
5680: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
5690: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
56a0: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
56b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
56c0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
56d0: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
56e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
56f0: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
5700: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
5710: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
5720: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
5730: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
5740: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
5750: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
5760: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5770: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
5780: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
5790: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
57a0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
57b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
57c0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
57d0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
57e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
57f0: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
5800: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
5810: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5820: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
5830: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
5840: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5850: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
5860: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
5870: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
5880: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
5890: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
58a0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
58b0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
58c0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
58d0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
58e0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
58f0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
5900: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
5910: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
5920: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
5930: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
5940: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
5950: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
5960: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
5970: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5980: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
5990: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
59a0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
59b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
59c0: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
59d0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
59e0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
59f0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
5a00: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
5a10: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5a20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5a30: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5a40: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
5a50: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
5a60: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
5a70: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
5a80: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
5a90: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
5aa0: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
5ab0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
5ac0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
5ad0: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
5ae0: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
5af0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
5b00: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
5b10: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
5b20: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
5b30: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
5b40: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
5b50: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
5b60: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
5b70: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
5b80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
5b90: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
5ba0: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
5bb0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
5bc0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
5bd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5be0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
5bf0: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
5c00: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
5c10: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
5c20: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
5c30: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
5c40: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
5c50: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
5c60: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
5c70: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
5c80: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
5c90: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
5ca0: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
5cb0: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
5cc0: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
5cd0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
5ce0: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
5cf0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
5d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
5d10: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
5d20: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
5d30: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
5d40: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5d50: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
5d60: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
5d70: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
5d80: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
5d90: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
5da0: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
5db0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
5dc0: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
5dd0: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
5de0: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
5df0: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
5e00: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
5e10: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
5e20: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
5e30: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
5e40: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
5e50: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
5e60: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
5e70: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
5e80: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
5e90: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
5ea0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
5eb0: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
5ec0: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
5ed0: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
5ee0: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
5ef0: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
5f00: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
5f10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
5f20: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
5f30: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
5f40: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
5f50: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
5f60: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
5f70: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
5f80: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
5f90: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
5fa0: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
5fb0: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
5fc0: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
5fd0: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
5fe0: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
5ff0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
6000: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
6010: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
6020: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
6030: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
6040: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
6050: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
6060: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
6070: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6080: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
6090: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
60a0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
60b0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
60c0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
60d0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
60e0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
60f0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6100: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6110: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6120: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6130: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6140: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6150: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6160: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6170: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6180: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
6190: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
61a0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
61b0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
61c0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
61d0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
61e0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
61f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6200: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  ERR_LOCK) || .  
6210: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
6220: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6230: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20  RR_UNLOCK) || . 
6240: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6250: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6260: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20  ERR_RDLOCK) ||. 
6270: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6280: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6290: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
62a0: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
62b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
62c0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
62d0: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
62e0: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
62f0: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
6300: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
6310: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
6320: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
6330: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
6340: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
6350: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
6360: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
6370: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
6380: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
6390: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
63a0: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
63b0: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
63c0: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
63d0: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
63e0: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
63f0: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
6400: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
6410: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
6420: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
6430: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
6440: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
6450: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
6460: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
6470: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
6480: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
6490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
64a0: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
64b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
64c0: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
64d0: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
64e0: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
64f0: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
6500: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
6510: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6520: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6530: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6540: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6550: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6560: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6570: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
6580: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6590: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
65a0: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
65b0: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
65c0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
65d0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
65e0: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
65f0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
6600: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
6610: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
6620: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
6630: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
6640: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
6650: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
6660: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
6670: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
6680: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66a0: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
66b0: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
66c0: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
66d0: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
66e0: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
66f0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
6700: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
6710: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
6720: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
6730: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
6740: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
6750: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
6760: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
6770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
67c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
67d0: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
67e0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
67f0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6810: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6820: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6830: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
6840: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
6850: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
6860: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
6870: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
6880: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
6890: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
68a0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
68b0: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
68c0: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
68d0: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
68e0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
68f0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6900: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6930: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
6940: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
6950: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
6960: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
6970: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
6980: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
6990: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
69a0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
69b0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
69c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
69d0: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
69e0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
69f0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6a00: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6a10: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6a20: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6a30: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
6a40: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
6a50: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
6a60: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
6a70: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
6a80: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
6a90: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
6aa0: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
6ab0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6ac0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6ad0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6ae0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6af0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6b00: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6b10: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6b20: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6b30: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b50: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
6b60: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6ba0: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
6bb0: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6bc0: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6bd0: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6be0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6bf0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6c00: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6c10: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6c20: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6c30: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6c40: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
6c50: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
6c60: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
6c70: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
6c80: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
6c90: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
6ca0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
6cb0: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6cc0: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6cd0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6ce0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6cf0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6d00: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6d10: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6d20: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6d30: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
6d40: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
6d50: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
6d60: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
6d70: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
6d80: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
6d90: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6da0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6db0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6dc0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6dd0: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6de0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6df0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6e00: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6e10: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6e20: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6e30: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6e40: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6e50: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6e60: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6e70: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6e80: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6e90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6ea0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6eb0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6ec0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6ed0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6ee0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6ef0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6f00: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6f10: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f30: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6f40: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6f50: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6f60: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6f70: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6f80: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6f90: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6fa0: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6fb0: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6fc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6fe0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6ff0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
7000: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
7010: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
7020: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
7030: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
7040: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
7050: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7060: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
7070: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
7080: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
7090: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
70a0: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
70b0: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
70c0: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
70d0: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
70e0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
70f0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
7100: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
7110: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
7120: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
7130: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
7140: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
7150: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7160: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7170: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7180: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
7190: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
71a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
71b0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
71c0: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
71d0: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
71e0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
71f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
7200: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
7210: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
7220: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
7230: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7240: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
7250: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
7260: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
7270: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
7280: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
72b0: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
72c0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
72d0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
72e0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
72f0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
7300: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
7310: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
7320: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
7330: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
7340: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7350: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7360: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
7370: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
7380: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
7390: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
73a0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
73b0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
73c0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
73d0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
73e0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
73f0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
7400: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
7410: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
7420: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
7430: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
7440: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
7450: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
7460: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7470: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
7480: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
7490: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
74a0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
74b0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
74c0: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
74d0: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
74e0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
74f0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
7500: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
7510: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
7520: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
7530: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
7540: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7550: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
7560: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
7570: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
7580: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
7590: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
75a0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
75b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
75c0: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
75d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
75e0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
75f0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
7600: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
7610: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
7620: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
7630: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7640: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
7650: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
7660: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
7670: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7680: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7690: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
76a0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
76b0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
76c0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
76d0: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
76e0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
76f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7700: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7710: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7720: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7730: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
7740: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
7750: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7760: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
7770: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
7780: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
7790: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
77a0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
77b0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
77c0: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
77d0: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
77e0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
77f0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
7800: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
7810: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
7820: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
7830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
7840: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
7850: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7860: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
7870: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
7890: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
78a0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
78b0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
78c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
78d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
7920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
7990: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
79c0: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
79d0: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
79e0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
79f0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
7a00: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
7a10: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
7a20: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
7a30: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
7a40: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
7a50: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
7a60: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
7a70: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
7a80: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
7a90: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
7aa0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
7ab0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
7ac0: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
7ad0: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
7ae0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
7af0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
7b00: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
7b10: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
7b20: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
7b30: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
7b40: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
7b50: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
7b60: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
7b70: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
7b80: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
7b90: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
7ba0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
7bb0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7bc0: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
7bd0: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
7be0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
7bf0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
7c00: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
7c10: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
7c20: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
7c30: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
7c40: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
7c50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
7c60: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
7c70: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
7c80: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
7c90: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
7ca0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
7cb0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
7cc0: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
7cd0: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
7ce0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
7cf0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
7d00: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
7d10: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
7d20: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
7d30: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7d40: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
7d50: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
7d60: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
7d70: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
7d80: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
7d90: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
7da0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
7db0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
7dc0: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
7dd0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
7de0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
7df0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
7e00: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
7e10: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
7e20: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
7e30: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
7e40: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
7e50: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
7e60: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
7e70: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
7e80: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
7e90: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
7ea0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
7eb0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
7ec0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
7ed0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
7ee0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
7ef0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
7f00: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
7f10: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
7f20: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
7f30: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
7f40: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
7f50: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
7f60: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7f70: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
7f80: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
7f90: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
7fa0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
7fb0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
7fc0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
7fd0: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
7fe0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
7ff0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
8000: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
8010: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
8020: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
8030: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
8040: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
8050: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
8060: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
8070: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
8080: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
8090: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
80a0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
80b0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
80c0: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
80d0: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
80e0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
80f0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
8100: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
8110: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
8120: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
8130: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
8140: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
8150: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
8160: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
8170: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
8180: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
8190: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
81a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
81b0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
81c0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
81d0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
81e0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
81f0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
8200: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
8210: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
8220: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8230: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
8240: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
8250: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8260: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
8270: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
8280: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8290: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
82a0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
82b0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
82c0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
82d0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
82e0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
82f0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
8300: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
8310: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
8320: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8330: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8340: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
8350: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
8360: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
8370: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
8380: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
8390: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
83a0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
83b0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
83c0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
83d0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
83e0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
83f0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
8400: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
8410: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
8420: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
8430: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
8440: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
8450: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
8460: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
8470: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
8480: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
8490: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
84a0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
84b0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
84c0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
84d0: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
84e0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
84f0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
8500: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
8510: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
8520: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
8530: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
8540: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
8550: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
8560: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
8570: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
8580: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
8590: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
85a0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
85b0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
85c0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
85d0: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
85e0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
85f0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
8600: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
8610: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
8620: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
8630: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
8640: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8650: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
8660: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8670: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
8680: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
8690: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
86a0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
86b0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
86c0: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
86d0: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
86e0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
86f0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8700: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8710: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8720: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8730: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8740: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
8750: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
8760: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
8770: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
8780: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
8790: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
87a0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
87b0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
87c0: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
87d0: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
87e0: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
87f0: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
8800: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
8810: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
8820: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
8830: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
8840: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
8850: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
8860: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
8870: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
8880: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
8890: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
88a0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
88b0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
88c0: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
88d0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
88e0: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
88f0: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
8900: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
8910: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
8920: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
8930: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
8940: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
8950: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
8960: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
8970: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
8980: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
8990: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
89a0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
89b0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
89c0: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
89d0: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
89e0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
89f0: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
8a00: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
8a10: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
8a20: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
8a30: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
8a40: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
8a50: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
8a60: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
8a70: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
8a80: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
8a90: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
8aa0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
8ab0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
8ac0: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
8ad0: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
8ae0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
8af0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
8b00: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
8b10: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
8b20: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
8b30: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
8b40: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
8b50: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
8b60: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
8b70: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
8b80: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
8b90: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
8ba0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
8bb0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
8bc0: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
8bd0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
8be0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
8bf0: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
8c00: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
8c10: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
8c20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8c30: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
8c40: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
8c50: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
8c60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8c70: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8c80: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
8c90: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
8ca0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
8cb0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
8cc0: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
8d10: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
8d20: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
8d30: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
8d40: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
8d50: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
8d60: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
8d70: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
8d80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
8d90: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
8da0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
8db0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
8dc0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8dd0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
8de0: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
8df0: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
8e00: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
8e10: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
8e20: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
8e30: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
8e40: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
8e50: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
8e60: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
8e70: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
8e80: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
8e90: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
8ea0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
8eb0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8ec0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
8ed0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
8ee0: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
8ef0: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
8f00: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8f10: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
8f20: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
8f30: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
8f40: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
8f50: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
8f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
8f70: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
8f80: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fa0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
8fb0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
8fc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
8fd0: 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  FileLock;       
8fe0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
8ff0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
9000: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
9010: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50  unsigned char bP
9020: 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20  rocessLock;     
9030: 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20  /* An exclusive 
9040: 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20  process lock is 
9050: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  held */.  int nR
9060: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
9070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9080: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
9090: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
90a0: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
90b0: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
90c0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
90d0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
90e0: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
90f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  de */.  int nLoc
9100: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9120: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
9130: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20   file locks */. 
9140: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9150: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
9160: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
9170: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
9180: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
9190: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
91a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
91b0: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
91c0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
91d0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
91e0: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
91f0: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
9200: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
9210: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
9220: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
9230: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
9240: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
9250: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
9260: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
9270: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
9280: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
9290: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92b0: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
92c0: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
92d0: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
92e0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
92f0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
9300: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
9310: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
9320: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
9330: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
9340: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
9350: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
9360: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
9370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9380: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
9390: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
93a0: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
93b0: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
93c0: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
93d0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
93e0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
93f0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
9400: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
9410: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
9420: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
9430: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
9440: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
9450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
9460: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
9470: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
9480: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
9490: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
94a0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
94b0: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
94c0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
94d0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
94e0: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
94f0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
9500: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
9510: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
9520: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
9530: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
9540: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
9550: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
9560: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
9570: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
9580: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
9590: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
95a0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
95b0: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
95c0: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61  open") and the a
95d0: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73  ssociated file-s
95e0: 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69  ystem path,.** i
95f0: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
9600: 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61  e unixLogError(a
9610: 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f  ,b,c)     unixLo
9620: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
9630: 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,c,__LINE__).sta
9640: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45  tic int unixLogE
9650: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
9660: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9680: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
9690: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
96a0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
96b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
96c0: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
96d0: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
96e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
96f0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
9700: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
9710: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
9720: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
9730: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9740: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
9750: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
9760: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
9770: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
9780: 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20  *zErr;          
9790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
97a0: 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72  ssage from strer
97b0: 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c  ror() or equival
97c0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72  ent */.  int iEr
97d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20  rno = errno;    
97e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
97f0: 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20  d syscall error 
9800: 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  number */..  /* 
9810: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
9820: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9830: 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  d (SQLITE_THREAD
9840: 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75  SAFE==0), then u
9850: 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65  se.  ** the stre
9860: 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  rror() function 
9870: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75  to obtain the hu
9880: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72  man-readable err
9890: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
98a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72  equivalent to er
98b0: 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
98c0: 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29  use strerror_r()
98d0: 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49  ..  */ .#if SQLI
98e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
98f0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54   defined(HAVE_ST
9900: 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72  RERROR_R).  char
9910: 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d   aErr[80];.  mem
9920: 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a  set(aErr, 0, siz
9930: 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45  eof(aErr));.  zE
9940: 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a  rr = aErr;..  /*
9950: 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43   If STRERROR_R_C
9960: 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75  HAR_P (set by au
9970: 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20  toconf scripts) 
9980: 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20  or __USE_GNU is 
9990: 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73  defined,.  ** as
99a0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
99b0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
99c0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66  e GNU version of
99d0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68   strerror_r() th
99e0: 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  at.  ** returns 
99f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
9a00: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
9a10: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
9a20: 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72  ge. That pointer
9a30: 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74   .  ** may point
9a40: 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69   to aErr[], or i
9a50: 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73  t may point to s
9a60: 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61  ome static stora
9a70: 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20  ge somewhere. . 
9a80: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
9a90: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
9aa0: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
9ab0: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
9ac0: 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72   of .  ** strerr
9ad0: 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c  or_r(), which al
9ae0: 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65  ways writes an e
9af0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
9b00: 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20  o aErr[]..  **. 
9b10: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20   ** If the code 
9b20: 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75  incorrectly assu
9b30: 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74  mes that it is t
9b40: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
9b50: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76   that is.  ** av
9b60: 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72  ailable, the err
9b70: 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
9b80: 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74  often be an empt
9b90: 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a  y string. Not a.
9ba0: 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65    ** huge proble
9bb0: 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63  m. Incorrectly c
9bc0: 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74  oncluding that t
9bd0: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69  he GNU version i
9be0: 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a  s available .  *
9bf0: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
9c00: 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67  a segfault thoug
9c10: 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  h..  */.#if defi
9c20: 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43  ned(STRERROR_R_C
9c30: 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65  HAR_P) || define
9c40: 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a  d(__USE_GNU).  z
9c50: 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20  Err = .# endif. 
9c60: 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72   strerror_r(iErr
9c70: 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66  no, aErr, sizeof
9c80: 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69  (aErr)-1);..#eli
9c90: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
9ca0: 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  AFE.  /* This is
9cb0: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
9cc0: 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f  ild, but strerro
9cd0: 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61  r_r() is not ava
9ce0: 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72  ilable. */.  zEr
9cf0: 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20  r = "";.#else.  
9d00: 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66  /* Non-threadsaf
9d10: 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72  e build, use str
9d20: 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45  error(). */.  zE
9d30: 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45  rr = strerror(iE
9d40: 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  rrno);.#endif.. 
9d50: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
9d60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
9d70: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
9d80: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71  zPath = "";.  sq
9d90: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
9da0: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69  e,.      "os_uni
9db0: 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  x.c:%d: (%d) %s(
9dc0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
9dd0: 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20   iLine, iErrno, 
9de0: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45  zFunc, zPath, zE
9df0: 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  rr.  );..  retur
9e00: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
9e10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
9e20: 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
9e30: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61  ** We assume tha
9e40: 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74  t close() almost
9e50: 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73   always works, s
9e60: 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20  ince it is only 
9e70: 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63  in a.** very sic
9e80: 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72  k application or
9e90: 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20   on a very sick 
9ea0: 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74  platform that it
9eb0: 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20   might fail..** 
9ec0: 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c  If it does fail,
9ed0: 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65   simply leak the
9ee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9ef0: 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65  , but do log the
9f00: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
9f10: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
9f20: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74   not safe to ret
9f30: 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72  ry close() after
9f40: 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65   EINTR since the
9f50: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
9f60: 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61  tor might have a
9f70: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73  lready been reus
9f80: 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68  ed by another th
9f90: 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64  read..** So we d
9fa0: 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f  on't even try to
9fb0: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e   recover from an
9fc0: 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f   EINTR.  Just lo
9fd0: 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61  g the error.** a
9fe0: 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73  nd move on..*/.s
9ff0: 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73  tatic void robus
a000: 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65  t_close(unixFile
a010: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20   *pFile, int h, 
a020: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69  int lineno){.  i
a030: 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b  f( osClose(h) ){
a040: 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
a050: 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49  rAtLine(SQLITE_I
a060: 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f  OERR_CLOSE, "clo
a070: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se",.           
a080: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
a090: 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e ? pFile->zPath
a0a0: 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20   : 0, lineno);. 
a0b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
a0c0: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
a0d0: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
a0e0: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
a0f0: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
a100: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
a110: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
a120: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
a130: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
a140: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a150: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
a160: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
a170: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
a180: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
a190: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
a1a0: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
a1b0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
a1c0: 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73  pNext;.    robus
a1d0: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
a1e0: 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ->fd, __LINE__);
a1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a200: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f  e(p);.  }.  pIno
a210: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  de->pUnused = 0;
a220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
a230: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
a240: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
a250: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
a260: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
a270: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
a280: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
a290: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
a2a0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
a2b0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
a2c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
a2d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
a2e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
a2f0: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
a300: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a310: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a320: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a330: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
a340: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
a350: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  d() );.  if( ALW
a360: 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20  AYS(pInode) ){. 
a370: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d     pInode->nRef-
a380: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
a390: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a3b0: 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  de->pShmNode==0 
a3c0: 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  );.      closePe
a3d0: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
a3e0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
a3f0: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a410: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a420: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a430: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
a440: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
a450: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
a470: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
a480: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a490: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
a4a0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a4c0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
a4d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a4e0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
a4f0: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
a500: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
a510: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a520: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
a530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a540: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
a550: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
a560: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
a570: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
a580: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
a590: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a5a0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
a5b0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
a5c0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
a5d0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
a5e0: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
a5f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
a600: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
a610: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
a620: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
a630: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
a640: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
a650: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
a660: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
a670: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
a680: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a690: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
a6a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
a6b0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
a6c0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
a6d0: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
a6e0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
a6f0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
a700: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
a710: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
a720: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
a730: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
a740: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a750: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
a760: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
a770: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
a7a0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
a7b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
a7e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
a7f0: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
a800: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
a810: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
a820: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
a830: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a840: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
a850: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
a860: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
a870: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
a880: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
a890: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
a8a0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
a8b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
a8c0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
a8d0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
a8e0: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
a8f0: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
a900: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a910: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
a920: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
a930: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
a940: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
a950: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
a960: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
a970: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
a980: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
a990: 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
a9a0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a9b0: 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  no;.#ifdef EOVER
a9c0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
a9d0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
a9e0: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
a9f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
aa00: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
aa10: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
aa20: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
aa30: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
aa40: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
aa50: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
aa60: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
aa70: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
aa80: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
aa90: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
aaa0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
aab0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
aac0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
aad0: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
aae0: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
aaf0: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
ab00: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
ab10: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
ab20: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
ab30: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
ab40: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
ab50: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
ab60: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
ab70: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
ab80: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
ab90: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
aba0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
abb0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
abc0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
abd0: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
abe0: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
abf0: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
ac00: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
ac10: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
ac20: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
ac30: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
ac40: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
ac50: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
ac60: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
ac70: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
ac80: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
ac90: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
aca0: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
acb0: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
acc0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
acd0: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
ace0: 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72     do{ rc = osWr
acf0: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
ad00: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
ad10: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
ad20: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
ad30: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
ad40: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
ad50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ad60: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
ad70: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
ad80: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
ad90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
ada0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
adb0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
adc0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
add0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ade0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
adf0: 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49  .  memset(&fileI
ae00: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c  d, 0, sizeof(fil
ae10: 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e  eId));.  fileId.
ae20: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
ae30: 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57  _dev;.#if OS_VXW
ae40: 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49  ORKS.  fileId.pI
ae50: 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a  d = pFile->pId;.
ae60: 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69  #else.  fileId.i
ae70: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
ae80: 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49  ino;.#endif.  pI
ae90: 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
aea0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64  ;.  while( pInod
aeb0: 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c  e && memcmp(&fil
aec0: 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69  eId, &pInode->fi
aed0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
aee0: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e  eId)) ){.    pIn
aef0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
af00: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
af10: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
af20: 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  pInode = sqlite3
af30: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
af40: 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20  *pInode) );.    
af50: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
af60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
af70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
af80: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e  }.    memset(pIn
af90: 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
afa0: 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65  pInode));.    me
afb0: 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69  mcpy(&pInode->fi
afc0: 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73  leId, &fileId, s
afd0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
afe0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
aff0: 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65   = 1;.    pInode
b000: 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c  ->pNext = inodeL
b010: 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ist;.    pInode-
b020: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
b030: 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20  if( inodeList ) 
b040: 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76  inodeList->pPrev
b050: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69   = pInode;.    i
b060: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
b070: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
b080: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pInode->nRef++;.
b090: 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d    }.  *ppInode =
b0a0: 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72   pInode;.  retur
b0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b0c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b0d0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
b0e0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
b0f0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
b100: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
b110: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
b120: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
b130: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
b140: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
b150: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
b160: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
b170: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
b180: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
b190: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
b1a0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
b1b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
b1c0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
b1d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
b1e0: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
b1f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
b200: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
b210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
b220: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
b230: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b240: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
b250: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
b260: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
b270: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
b280: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b290: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
b2a0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b2b0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
b2c0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b2d0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
b2e0: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
b2f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
b300: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b310: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
b320: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
b330: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
b340: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
b350: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
b360: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
b370: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
b380: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
b390: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
b3a0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
b3b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
b3c0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
b3d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
b3e0: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
b3f0: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
b400: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b410: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
b420: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
b430: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
b440: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
b450: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b460: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
b470: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b480: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
b490: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
b4a0: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
b4b0: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
b4c0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
b4d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
b4e0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
b4f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
b500: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
b510: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
b520: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
b530: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
b540: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
b550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b560: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
b570: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
b580: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
b590: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
b5a0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
b5b0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
b5c0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
b5d0: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
b5e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
b5f0: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
b600: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
b610: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
b620: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
b630: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
b640: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
b650: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
b660: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
b670: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
b680: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
b690: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
b6a0: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
b6b0: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
b6c0: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
b6d0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
b6e0: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
b6f0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
b700: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
b710: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
b720: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
b730: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
b740: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
b750: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
b760: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
b770: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
b780: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
b790: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
b7a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
b7b0: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
b7c0: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
b7d0: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
b7e0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
b7f0: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
b800: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
b810: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
b820: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b830: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
b840: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
b850: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
b860: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
b870: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
b880: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
b890: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
b8a0: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
b8b0: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
b8c0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
b8d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
b8e0: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
b8f0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
b900: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
b910: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
b920: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
b930: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
b940: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
b950: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
b960: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
b970: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
b980: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
b990: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
b9a0: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
b9b0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
b9c0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
b9d0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
b9e0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
b9f0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
ba00: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
ba10: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
ba20: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
ba30: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
ba40: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
ba50: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
ba60: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
ba70: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
ba80: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
ba90: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
baa0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
bab0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
bac0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
bad0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
bae0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
baf0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bb00: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
bb10: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
bb20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bb30: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bb40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
bb50: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
bb60: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bb70: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bb80: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
bb90: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
bba0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
bbb0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bbc0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
bbd0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
bbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
bbf0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
bc00: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
bc10: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
bc20: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
bc30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bc40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
bc50: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
bc60: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
bc70: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
bc80: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
bc90: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
bca0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
bcb0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
bcc0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
bcd0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
bce0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
bcf0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
bd00: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
bd10: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
bd20: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
bd30: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
bd40: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
bd50: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
bd60: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
bd70: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
bd80: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
bd90: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
bda0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
bdb0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
bdc0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
bdd0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
bde0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
bdf0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
be00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
be10: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
be20: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
be30: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
be40: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
be50: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
be60: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
be70: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
be80: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
be90: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
bea0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
beb0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
bec0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
bed0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
bee0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
bef0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
bf00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bf10: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
bf20: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
bf30: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bf40: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
bf50: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
bf60: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
bf70: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
bf80: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
bf90: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
bfa0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
bfb0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
bfc0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
bfd0: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
bfe0: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
bff0: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
c000: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
c010: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
c020: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
c030: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
c040: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
c050: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
c060: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
c070: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
c080: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
c090: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
c0a0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
c0b0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
c0c0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
c0d0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
c0e0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
c0f0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
c100: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
c110: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
c120: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
c130: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
c140: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
c150: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
c160: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
c170: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
c180: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c190: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
c1a0: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
c1b0: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
c1c0: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
c1d0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
c1e0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c1f0: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
c200: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
c210: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
c220: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
c230: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
c240: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
c250: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
c260: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
c270: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
c280: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
c290: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
c2a0: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
c2b0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
c2c0: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
c2d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
c2e0: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
c2f0: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
c300: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
c310: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c320: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
c330: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
c340: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
c350: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
c360: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
c370: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
c380: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
c390: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
c3a0: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
c3b0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
c3c0: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
c3d0: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
c3e0: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
c3f0: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
c400: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
c410: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
c420: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
c430: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
c440: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
c450: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
c460: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
c470: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
c480: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
c490: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
c4a0: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
c4b0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
c4c0: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
c4d0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
c4e0: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
c4f0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
c500: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
c510: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
c520: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
c530: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
c540: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
c550: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
c560: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
c570: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
c580: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
c590: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
c5a0: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
c5b0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c5c0: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
c5d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
c5e0: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
c5f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
c600: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
c610: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
c620: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
c630: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
c640: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
c650: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
c660: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
c670: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
c680: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
c690: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
c6a0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c6b0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
c6c0: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
c6d0: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
c6e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
c6f0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
c700: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
c710: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
c720: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
c730: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
c740: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
c750: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
c760: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
c770: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
c780: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
c790: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
c7a0: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
c7b0: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
c7c0: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
c7d0: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
c7e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c7f0: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
c800: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
c810: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
c820: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
c830: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
c840: 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f  ck;.  int tErrno
c850: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
c860: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
c870: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
c880: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
c890: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
c8a0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
c8b0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
c8c0: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
c8d0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
c8e0: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
c8f0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
c900: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
c910: 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ck), pFile->pIno
c920: 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
c930: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
c940: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
c950: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
c960: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
c970: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
c980: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
c990: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
c9a0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
c9b0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
c9c0: 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
c9d0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
c9e0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
c9f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
ca00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
ca10: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
ca20: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
ca30: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
ca40: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
ca50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ca60: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
ca70: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
ca80: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
ca90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
caa0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
cab0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
cac0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
cad0: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
cae0: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
caf0: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
cb00: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
cb10: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
cb20: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
cb30: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
cb40: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
cb50: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
cb60: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
cb70: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
cb80: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
cb90: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
cba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
cbb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
cbc0: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
cbd0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
cbe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
cbf0: 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
cc00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
cc10: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
cc20: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
cc30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
cc40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
cc50: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
cc60: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
cc70: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
cc80: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
cc90: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
cca0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
ccb0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
ccc0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
ccd0: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
cce0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
ccf0: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
cd00: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
cd10: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
cd20: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
cd30: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
cd40: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
cd50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
cd60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
cd70: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cd80: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
cd90: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
cda0: 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
cdb0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
cdc0: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
cdd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cde0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
cdf0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
ce00: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
ce10: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
ce20: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
ce30: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
ce40: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
ce50: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
ce60: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
ce70: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
ce80: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
ce90: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
cea0: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
ceb0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
cec0: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
ced0: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
cee0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
cef0: 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
cf00: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
cf10: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
cf20: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
cf30: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
cf40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
cf50: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
cf60: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
cf70: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
cf80: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
cf90: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
cfa0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
cfb0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
cfc0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
cfd0: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
cfe0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
cff0: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
d000: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
d010: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
d020: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
d030: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
d040: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
d050: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
d060: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
d070: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
d080: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
d090: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
d0a0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
d0b0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
d0c0: 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
d0d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d0e0: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
d0f0: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d100: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
d110: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
d120: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
d130: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d140: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
d150: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
d160: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
d170: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
d180: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
d190: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d1a0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
d1b0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
d1c0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d1d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d1e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d1f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d200: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
d210: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
d220: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
d230: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d240: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d250: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d260: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
d270: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
d280: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
d290: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
d2a0: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
d2b0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
d2c0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
d2d0: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
d2e0: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
d2f0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d300: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d310: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d320: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
d330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d340: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d350: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d360: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d370: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
d380: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
d390: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
d3a0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
d3b0: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
d3c0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d3d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d3e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d3f0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
d400: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d410: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d420: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d430: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d440: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
d450: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
d460: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
d470: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
d480: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d490: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
d4a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
d4b0: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
d4c0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
d4d0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
d4e0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
d4f0: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
d500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
d510: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
d520: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
d530: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
d540: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d550: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
d570: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
d580: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
d590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
d5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d5b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d5c0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
d5d0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
d5e0: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
d5f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
d600: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
d610: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
d620: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
d630: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
d640: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
d650: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
d660: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d670: 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
d680: 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
d690: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
d6a0: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
d6b0: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
d6c0: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
d6d0: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
d6e0: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
d6f0: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
d700: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
d710: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
d720: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
d730: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
d740: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
d750: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
d760: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
d770: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
d780: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
d790: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
d7a0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
d7b0: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
d7c0: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
d7d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d7e0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
d7f0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20  pe = F_WRLCK;.. 
d800: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
d810: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
d820: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
d830: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
d840: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c   );.    if( eFil
d850: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d860: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
d870: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
d880: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
d890: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
d8a0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
d8b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d8c0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
d8d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
d8e0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
d8f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
d900: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
d910: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
d920: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d930: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
d940: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d950: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d960: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
d970: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
d980: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
d990: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
d9a0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d9b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
d9c0: 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65   }.  }.  ..#ifde
d9d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
d9e0: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
d9f0: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
da00: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
da10: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
da20: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
da30: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
da40: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
da50: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
da60: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
da70: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
da80: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
da90: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
daa0: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
dab0: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
dac0: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
dad0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
dae0: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
daf0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
db00: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26  SHARED_LOCK.   &
db10: 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  & eFileLock==RES
db20: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
db30: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
db40: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
db50: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
db60: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
db70: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
db80: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
db90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
dba0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
dbb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
dbd0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
dbe0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
dbf0: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
dc00: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
dc10: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
dc20: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
dc30: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
dc40: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dc50: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
dc60: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
dc70: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
dc80: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
dc90: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
dca0: 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
dcb0: 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
dcc0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
dcd0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
dce0: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
dcf0: 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
dd00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
dd10: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
dd20: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
dd30: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
dd40: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
dd50: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
dd60: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
dd70: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
dd80: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
dd90: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
dda0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
ddb0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
ddc0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
ddd0: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
dde0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
ddf0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
de00: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
de10: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
de20: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
de30: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
de40: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
de50: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
de60: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
de70: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
de80: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
de90: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
dea0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
deb0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
dec0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
ded0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
dee0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
def0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
df00: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
df10: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
df20: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
df30: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
df40: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
df50: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
df60: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
df70: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
df80: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
df90: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
dfa0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
dfb0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
dfc0: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
dfd0: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
dfe0: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
dff0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
e000: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
e010: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
e020: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
e030: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
e040: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
e050: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
e060: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
e070: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
e080: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
e090: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
e0a0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
e0b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e0c0: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
e0d0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e0e0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
e0f0: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
e100: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
e110: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e120: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
e130: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
e140: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
e150: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
e160: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
e170: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
e180: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
e190: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
e1a0: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
e1b0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
e1c0: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
e1d0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e1e0: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
e1f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
e200: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
e210: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65  Shared,.      ge
e220: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
e230: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e240: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e250: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e260: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e280: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e290: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e2a0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e2b0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e2c0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e2d0: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e2e0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e2f0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e300: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e310: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e320: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e330: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e340: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e350: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e360: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e370: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e380: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e390: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e3a0: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e3b0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e3c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e3d0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e3e0: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e3f0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e400: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e410: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e420: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e430: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e440: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e450: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e460: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e470: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e480: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e490: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e4a0: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e4b0: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e4c0: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e4d0: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e4e0: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e4f0: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e500: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e510: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e520: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e530: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e540: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e550: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e560: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e570: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e580: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e590: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e5a0: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e5b0: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e5c0: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e5d0: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e5e0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e5f0: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e600: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e610: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e620: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e630: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e640: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e650: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
e660: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
e670: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
e680: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
e690: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
e6a0: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
e6b0: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
e6c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
e6d0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
e6e0: 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66  OCK ){..#if !def
e6f0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
e700: 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c  || !SQLITE_ENABL
e710: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
e720: 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64        (void)hand
e730: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20  leNFSUnlock;.   
e740: 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c     assert( handl
e750: 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b  eNFSUnlock==0 );
e760: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
e770: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
e780: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
e790: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
e7a0: 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46      if( handleNF
e7b0: 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  SUnlock ){.     
e7c0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20     int tErrno;  
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7e0: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
e7f0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f  system call erro
e800: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  rs */.        of
e810: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
e820: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
e830: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
e840: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e850: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
e860: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e870: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e880: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e890: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e8a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e8b0: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
e8c0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e8d0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e8e0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
e8f0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
e900: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e920: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e930: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
e940: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
e950: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e960: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
e970: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
e980: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e990: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e9a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
e9b0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
e9c0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
e9d0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e9e0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
e9f0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ea00: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
ea10: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ea20: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
ea30: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ea40: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
ea50: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ea60: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
ea70: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
ea80: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ea90: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
eaa0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
eab0: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
eac0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ead0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
eae0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
eaf0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
eb00: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
eb10: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
eb20: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
eb30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
eb40: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
eb50: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
eb60: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
eb70: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
eb80: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
eb90: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
eba0: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
ebb0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ebc0: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
ebd0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
ebe0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
ebf0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
ec00: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
ec10: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ec20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ec30: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ec40: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ec50: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ec60: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ec70: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ec80: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ec90: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
eca0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ecb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ecc0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
ecd0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
ece0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
ecf0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
ed00: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
ed10: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ed20: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
ed30: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ed40: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ed50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ed60: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ed70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
ed80: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ed90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
eda0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
edb0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
edc0: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
edd0: 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
ede0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
edf0: 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
ee00: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
ee10: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
ee20: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
ee30: 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
ee40: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
ee50: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
ee60: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
ee70: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
ee80: 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
ee90: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
eea0: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
eeb0: 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
eec0: 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
eed0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
eee0: 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
eef0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
ef00: 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
ef10: 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
ef20: 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
ef30: 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
ef40: 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
ef50: 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
ef60: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
ef70: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
ef80: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  K;.          pFi
ef90: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
efa0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
efb0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
efc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
efd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
efe0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
eff0: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
f000: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f010: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
f020: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
f030: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
f040: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
f050: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
f060: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
f070: 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
f080: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f090: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
f0a0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f0b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
f0c0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
f0d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f0e0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
f0f0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f100: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f110: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f120: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
f130: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f140: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
f150: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
f160: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
f170: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
f180: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
f190: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
f1a0: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
f1b0: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
f1c0: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
f1d0: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
f1e0: 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
f1f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
f200: 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
f210: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
f220: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
f230: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f240: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
f250: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f260: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
f270: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
f280: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
f290: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f2a0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
f2b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
f2c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f2d0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
f2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
f2f0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f300: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  NLOCK;.        p
f310: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f320: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f330: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f340: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
f350: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
f360: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
f370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f380: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
f390: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
f3a0: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
f3b0: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
f3c0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
f3d0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
f3e0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
f3f0: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
f400: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
f410: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
f420: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
f430: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
f440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
f450: 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
f460: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
f470: 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
f480: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
f490: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
f4a0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
f4b0: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
f4c0: 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
f4d0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
f4e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
f4f0: 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
f500: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
f510: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
f520: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
f530: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
f540: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
f550: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
f560: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
f570: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
f580: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
f590: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
f5a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
f5b0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
f5c0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f5d0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
f5e0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
f5f0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
f600: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
f610: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
f620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f630: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
f640: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f650: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 61   eFileLock){.  a
f660: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
f670: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
f680: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
f690: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
f6a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  );.  return posi
f6b0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
f6c0: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 73 74  eLock, 0);.}..st
f6d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70  atic int unixMap
f6e0: 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
f6f0: 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a  Fd, i64 nByte);.
f700: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
f710: 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
f720: 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f 2a 0a 2a 2a  le *pFd);../*.**
f730: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
f740: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
f750: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
f760: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
f770: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
f780: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
f790: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
f7a0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
f7b0: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
f7c0: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
f7d0: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
f7e0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
f7f0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
f800: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
f810: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
f820: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
f830: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
f840: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f850: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
f860: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
f870: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
f880: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
f890: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
f8a0: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
f8b0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
f8c0: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
f8d0: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
f8e0: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
f8f0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f900: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
f910: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
f920: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  ;.  if( pFile->h
f930: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
f940: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
f950: 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
f960: 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
f970: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
f980: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
f990: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
f9a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
f9b0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
f9c0: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
f9d0: 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
f9e0: 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
f9f0: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
fa00: 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
fa10: 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
fa20: 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
fa30: 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
fa40: 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
fa50: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
fa60: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
fa70: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
fa80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
fa90: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
faa0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
fab0: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
fac0: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
fad0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fae0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
faf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
fb00: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
fb10: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
fb20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fb30: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fb40: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
fb50: 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6d 61 70  )id;.  unixUnmap
fb60: 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  file(pFile);.  u
fb70: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
fb80: 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
fb90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
fba0: 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
fbb0: 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
fbc0: 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
fbd0: 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
fbe0: 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
fbf0: 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
fc00: 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
fc10: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
fc20: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fc30: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
fc40: 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
fc50: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
fc60: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
fc70: 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
fc80: 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
fc90: 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
fca0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
fcb0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
fcc0: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
fcd0: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
fce0: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
fcf0: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
fd00: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
fd10: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
fd20: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
fd30: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
fd40: 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
fd50: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
fd60: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
fd70: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
fd80: 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
fd90: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
fda0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
fdb0: 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
fdc0: 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
fdd0: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
fde0: 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
fdf0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
fe00: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
fe10: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
fe20: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
fe30: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
fe40: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
fe50: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
fe60: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
fe70: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fec0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff30: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
ff40: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
ff50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff60: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
ff70: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
ff80: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
ff90: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
ffa0: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
ffb0: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
ffc0: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
ffd0: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
ffe0: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
fff0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
10000 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
10010 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
10020 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
10030 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
10040 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
10050 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10060 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10070 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10080 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10090 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
100a0 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
100b0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
100c0 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
100d0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
100e0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
100f0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10100 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10110 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10120 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10130 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10140 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10150 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10160 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10170 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10180 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10190 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
101a0 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
101b0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
101c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
101d0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
101e0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
101f0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10200 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10210 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
10220 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10230 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10240 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10250 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10260 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10270 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10280 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10290 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
102a0 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
102b0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
102c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
102d0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
102e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
102f0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10300 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10310 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
10320 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10340 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10350 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10360 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10370 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10380 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10390 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
103a0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
103b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
103c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
103d0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
103e0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
103f0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10400 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10410 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10420 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10440 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10450 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10460 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10470 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10510 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
10540 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
10570 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10580 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10590 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
105a0 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
105b0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
105c0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
105d0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
105e0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
105f0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10600 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10610 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10620 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10630 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10640 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10650 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10660 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
10670 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
10680 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
10690 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
106a0 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
106b0 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
106c0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
106d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
106e0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
106f0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
10700 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
10710 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
10720 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
10730 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
10740 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
10750 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
10760 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
10770 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
10780 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
10790 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
107a0 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
107b0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
107c0 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
107d0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
107e0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
107f0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
10800 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
10810 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
10820 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
10830 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
10840 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
10850 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
10860 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
10870 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
10880 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
10890 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
108a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
108b0 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
108c0 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
108d0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
108e0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
108f0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
10900 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
10910 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
10920 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
10930 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
10940 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
10950 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
10960 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
10970 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
10980 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
10990 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
109a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
109b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
109c0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
109d0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
109e0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
109f0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
10a00 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
10a10 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
10a20 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
10a30 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
10a40 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
10a50 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
10a60 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
10a70 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
10a80 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
10a90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
10aa0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
10ab0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
10ac0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
10ad0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
10ae0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
10af0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
10b00 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
10b10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
10b20 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
10b30 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
10b40 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
10b50 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
10b60 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
10b70 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
10b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
10b90 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
10ba0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
10bb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
10bc0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
10bd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10be0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
10bf0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
10c00 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10c10 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
10c20 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
10c30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
10c40 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
10c50 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
10c60 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
10c70 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
10c80 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
10c90 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
10ca0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
10cb0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
10cc0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10cd0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
10ce0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
10cf0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
10d00 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
10d10 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
10d20 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
10d30 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
10d40 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
10d50 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
10d60 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
10d70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
10d80 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
10d90 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
10da0 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
10db0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10dc0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
10dd0 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
10de0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10df0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
10e00 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
10e10 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
10e20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
10e30 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
10e40 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
10e50 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
10e60 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
10e70 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
10e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10e90 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
10ea0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
10eb0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
10ec0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
10ed0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
10ee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
10ef0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
10f00 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
10f10 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
10f20 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
10f30 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
10f40 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
10f50 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
10f60 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
10f70 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
10f80 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
10f90 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
10fa0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
10fb0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
10fc0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
10fd0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
10fe0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10ff0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11000 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11010 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11020 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11030 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11040 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11050 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11060 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11070 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11080 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11090 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
110a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
110b0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
110c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
110d0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
110e0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
110f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11100 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11110 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11120 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11130 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11140 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11150 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11160 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11170 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11180 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11190 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
111a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
111b0 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
111c0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
111d0 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
111e0 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
111f0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11200 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11210 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
11220 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11230 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11240 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11250 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11260 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11270 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11280 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11290 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
112a0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
112b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
112c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
112d0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
112e0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
112f0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11300 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11310 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
11320 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11330 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11340 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11350 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11360 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11370 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11380 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11390 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
113a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
113b0 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
113c0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
113d0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
113e0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
113f0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11400 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11410 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
11420 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11430 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11450 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11460 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11470 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11480 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11490 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
114a0 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
114b0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
114c0 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
114d0 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
114e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
114f0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11500 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11510 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11520 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11530 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11540 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11550 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11560 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
11570 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11580 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11590 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
115a0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
115b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
115c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
115d0 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
115e0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
115f0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11600 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
11610 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
11620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11630 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
11640 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11650 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11660 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11670 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11680 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11690 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
116a0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
116b0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
116c0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
116d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
116e0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
116f0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11700 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
11710 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
11720 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
11730 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
11740 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
11750 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
11760 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
11770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11780 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
11790 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
117a0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
117b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
117c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
117d0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
117e0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
117f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11800 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
11810 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11820 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
11830 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
11840 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
11850 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
11860 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11870 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
11880 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
11890 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
118a0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
118b0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
118c0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
118d0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
118e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
118f0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11910 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11920 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11930 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11940 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11950 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11960 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11970 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11980 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11990 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
119a0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
119b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
119c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
119d0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
119e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
119f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11a00 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
11a10 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11a20 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
11a30 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
11a40 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
11a50 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
11a60 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
11a70 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11a80 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
11a90 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
11aa0 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
11ab0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
11ac0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11ad0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
11ae0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
11af0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
11b00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
11b10 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
11b20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
11b30 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11b40 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11b50 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11b60 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11b70 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
11b80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
11b90 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
11ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11bb0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
11bc0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
11bd0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
11be0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
11bf0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
11c00 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
11c10 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
11c20 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
11c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11c40 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
11c50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11c60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11c70 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
11c80 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
11c90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11ca0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11cb0 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
11cc0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11cd0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
11ce0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
11cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
11d00 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
11d10 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
11d20 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
11d30 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
11e00 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e20 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
11e30 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
11e40 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
11e50 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
11e60 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
11e70 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
11e80 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
11e90 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
11ea0 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
11eb0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
11ec0 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
11ed0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
11ee0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
11ef0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
11f00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11f10 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
11f20 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
11f30 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
11f40 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
11f50 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
11f60 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
11f70 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
11f80 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
11f90 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
11fa0 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
11fb0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
11fc0 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
11fd0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11fe0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
11ff0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
12000 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12010 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12020 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12030 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
12040 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
12050 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12060 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12070 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12080 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
12090 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
120a0 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
120b0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
120c0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
120d0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
120e0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
120f0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
12100 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
12110 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
12120 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12140 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12150 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12160 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12170 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
12180 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12190 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
121a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
121b0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
121c0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
121d0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
121e0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
121f0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12200 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12210 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12220 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12230 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12240 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12250 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12260 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12270 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12280 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12290 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
122a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
122b0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
122c0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
122d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
122e0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
122f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12300 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12310 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12320 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12330 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12340 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12350 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12360 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12370 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12380 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
12390 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
123a0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
123b0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
123c0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
123d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
123e0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
123f0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12400 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12410 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12420 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12430 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12440 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12450 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12460 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12470 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
12480 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12490 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
124a0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
124b0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
124c0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
124d0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
124e0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
124f0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12500 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
12510 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
12520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12530 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12540 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
12550 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
12560 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
12570 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
12580 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
12590 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
125a0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
125b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
125c0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
125d0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
125e0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
125f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12600 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12610 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12620 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12630 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
12640 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
12650 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
12660 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12670 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12680 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12690 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
126a0 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
126b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
126c0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
126d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
126e0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
126f0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
12700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12710 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
12720 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
12730 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
12740 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12750 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
12760 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12770 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12780 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12790 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
127a0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
127b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
127c0 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
127d0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
127e0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
127f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12800 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12810 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12820 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12830 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12840 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12850 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12860 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12870 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12880 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12890 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
128a0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
128b0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
128c0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
128d0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
128e0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
128f0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12900 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12910 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12920 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12930 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12940 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12950 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12960 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12970 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12980 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12990 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
129a0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
129b0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
129c0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
129d0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
129e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
129f0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12a00 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12a10 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12a20 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12a30 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12a40 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12a50 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12a60 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12a70 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
12a80 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12a90 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
12aa0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
12ab0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12ac0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
12ad0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12ae0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
12af0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
12b00 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
12b10 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
12b20 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
12b30 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
12b40 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
12b50 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
12b60 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
12b70 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
12b80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
12b90 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
12ba0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
12bb0 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
12bc0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
12bd0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
12be0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
12bf0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
12c00 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
12c10 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
12c20 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
12c30 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
12c40 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
12c50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12c60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
12c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12c80 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
12c90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12ca0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
12cb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
12cc0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
12cd0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
12ce0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
12cf0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
12d00 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
12d10 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
12d20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
12d30 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
12d40 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12d50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12d60 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
12d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12d80 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
12d90 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12da0 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
12db0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12dc0 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
12dd0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
12de0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12df0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
12e00 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
12e10 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
12e20 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12e30 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12e40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12e50 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
12e60 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
12e70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12e80 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12e90 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
12ea0 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
12eb0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
12ec0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
12ed0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12ee0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12ef0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
12f00 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
12f10 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
12f20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
12f30 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
12f40 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
12f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
12f60 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
12f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
12f80 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12f90 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
12fa0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
12fb0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
12fc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12fd0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
12fe0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
12ff0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13000 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
13010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13020 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13030 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13040 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13050 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13060 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13070 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13080 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13090 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
130a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
130b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
130c0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
130d0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
130e0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
130f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13100 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13110 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13120 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13130 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13140 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13150 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13160 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13170 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13180 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13190 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
131a0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
131b0 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
131c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
131d0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
131e0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
131f0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
13200 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13210 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13220 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13230 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13240 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13250 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13260 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13280 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13290 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
132a0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
132b0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
132c0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
132d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
132e0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
132f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13300 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13320 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13330 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13340 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13350 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13360 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13370 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13380 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
133a0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
133b0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
133c0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
133d0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
133e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
133f0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
13400 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13410 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
13420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13430 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
13440 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13450 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13460 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13470 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13490 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
134a0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
134b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
134c0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
134d0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
134e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
134f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13500 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13510 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
13520 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13530 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13540 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
13550 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13570 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135c0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
13630 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
13640 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
13650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13660 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
13670 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
13680 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
13690 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
136a0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
136b0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
136c0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
136d0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
136e0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
136f0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
13700 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
13710 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
13720 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
13730 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
13740 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
13750 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
13760 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
13770 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
13780 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
13790 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
137a0 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
137b0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
137c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
137d0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
137e0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
137f0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
13800 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
13810 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
13820 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
13830 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
13840 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
13850 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
13860 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
13870 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
13880 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
13890 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
138a0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
138b0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
138c0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
138d0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
138e0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
138f0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
13900 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13910 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13920 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13930 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13940 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13950 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13960 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13970 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13980 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13990 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
139a0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
139b0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
139c0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
139d0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
139e0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
139f0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13a00 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13a20 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13a30 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13a40 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13a50 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13a60 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13a70 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13a80 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13a90 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
13aa0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13ab0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
13ac0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
13ad0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
13ae0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
13af0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
13b00 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
13b10 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
13b20 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
13b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13b40 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13b50 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13b60 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
13b70 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
13b80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13b90 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
13ba0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
13bb0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
13bc0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
13bd0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
13be0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
13bf0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
13c00 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
13c10 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
13c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13c30 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
13c40 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
13c50 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
13c60 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
13c70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
13c80 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
13c90 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
13ca0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
13cb0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
13cc0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
13cd0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
13ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cf0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
13d00 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
13d10 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
13d20 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
13d30 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
13d40 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
13d50 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
13d60 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
13d70 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
13d80 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
13d90 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
13da0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
13db0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
13dc0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
13dd0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
13de0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
13df0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
13e00 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
13e10 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
13e20 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
13e30 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
13e40 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
13e50 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
13e60 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
13e70 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
13e80 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
13e90 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
13ea0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
13eb0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
13ec0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
13ed0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
13ee0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
13ef0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
13f00 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
13f10 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
13f20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
13f30 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
13f40 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13f50 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13f60 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
13f70 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13f80 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
13f90 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
13fa0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
13fb0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
13fc0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
13fd0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
13fe0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13ff0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
14000 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
14010 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
14020 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
14030 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
14040 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
14050 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
14060 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
14070 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
14080 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
14090 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
140a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
140b0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
140c0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
140d0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
140e0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
140f0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14100 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14110 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
14120 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14130 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14140 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14150 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14160 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
14170 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14180 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14190 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
141a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
141b0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
141c0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
141d0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
141e0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
141f0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
14200 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14210 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14220 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14230 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14240 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14250 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14260 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14270 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14280 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14290 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
142a0 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
142b0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
142c0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
142d0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
142e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
142f0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
14300 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14310 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
14320 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
14330 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14340 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14350 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14360 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14380 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14390 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
143a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
143b0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
143c0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
143d0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
143e0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
143f0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
14400 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14410 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
14420 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14430 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14440 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14450 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14460 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14470 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14480 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
14490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
144a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
144b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
144c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
144d0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
144e0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
144f0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
14500 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14510 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
14520 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
14530 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
14540 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
14550 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
14560 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
14570 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14580 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
14590 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
145a0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
145b0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
145c0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
145d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
145e0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
145f0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14610 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14620 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14630 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14640 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14650 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14660 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14670 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14680 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14690 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
146a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
146b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
146c0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
146d0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
146e0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
146f0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
14700 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
14710 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14720 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14730 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14740 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
14750 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14760 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
14770 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14780 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
14790 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
147a0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
147b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
147c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
147d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
147e0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
147f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14800 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14810 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
14820 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
14830 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14840 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
14850 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
14860 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14870 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14880 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14890 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
148a0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
148b0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
148c0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
148d0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
148e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148f0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14900 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14910 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14920 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14930 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14940 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14960 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14970 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14980 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
149a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
149f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14a60 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14a90 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
14aa0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
14ab0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
14ac0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
14ad0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
14ae0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
14af0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
14b00 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
14b10 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
14b20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
14b30 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
14b40 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
14b50 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
14b60 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
14b70 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
14b80 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
14b90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14ba0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
14bb0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
14bc0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
14bd0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
14be0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
14bf0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
14c00 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
14c10 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
14c20 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
14c30 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14c40 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
14c50 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
14c60 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
14c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
14c80 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
14c90 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
14ca0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14cb0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
14cc0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
14cd0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
14ce0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
14cf0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
14d00 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14d10 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
14d20 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
14d30 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
14d40 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
14d50 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
14d60 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
14d70 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
14d80 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
14d90 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
14da0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
14db0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
14dc0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
14dd0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
14de0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
14df0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
14e00 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
14e10 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
14e40 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
14e50 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
14e60 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
14e70 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
14e80 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
14e90 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
14ea0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
14eb0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
14ec0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
14ed0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
14ee0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
14ef0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
14f00 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
14f10 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
14f20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
14f30 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
14f40 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
14f50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
14f60 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
14f70 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
14f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
14f90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
14fa0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
14fb0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
14fc0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
14fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
14fe0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
14ff0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15000 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15010 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15020 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15030 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15040 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15050 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15060 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15070 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15080 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
150a0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
150b0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
150c0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
150d0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
150e0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
150f0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15100 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15110 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15120 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15130 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15140 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15150 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15160 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15170 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15180 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15190 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
151a0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
151b0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
151c0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
151d0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
151e0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
151f0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15200 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15210 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15220 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15230 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15240 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15250 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15260 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15270 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15280 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15290 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
152a0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
152b0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
152c0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
152d0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
152e0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
152f0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15300 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15320 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15330 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15340 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15350 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15360 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15370 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15380 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15390 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
153a0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
153b0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
153c0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
153d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
153e0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
153f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15400 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
15410 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15420 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15450 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15460 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15470 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15480 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15490 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
154a0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
154b0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
154c0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
154d0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
154e0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
154f0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15500 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
15510 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
15520 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
15530 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
15540 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
15550 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15560 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15570 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15580 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15590 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
155a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
155b0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
155c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
155d0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
155e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
155f0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15600 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
15610 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
15620 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
15630 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
15640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
15650 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15660 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15670 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
15680 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15690 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
156a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
156b0 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
156c0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
156d0 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
156e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
156f0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
15700 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
15710 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15720 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15730 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
15740 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
15750 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15760 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15770 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15780 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15790 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
157a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
157b0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
157c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
157d0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
157e0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
157f0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
15800 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15810 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
15820 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
15830 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
15840 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15850 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15860 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15870 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15880 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15890 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
158a0 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
158b0 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
158c0 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
158d0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
158e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
158f0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15900 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15910 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15920 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15930 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15940 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15950 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15960 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15970 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15980 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15990 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
159a0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
159b0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
159c0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
159d0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
159e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
159f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15a00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15a10 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15a20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
15a30 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
15a40 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
15a50 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
15a60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a70 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
15a80 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
15a90 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
15aa0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
15ab0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
15ac0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15ad0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15ae0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15af0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15b00 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15b10 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15b20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15b30 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15b40 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15b50 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15b60 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15b70 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15b80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15b90 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15ba0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15bb0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
15bc0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15bd0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15be0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
15bf0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
15c00 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
15c10 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15c20 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15c30 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15c40 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15c50 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15c60 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
15c70 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
15c80 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
15c90 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
15ca0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15cb0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
15cc0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
15cd0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15ce0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
15cf0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15d00 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
15d10 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
15d20 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
15d30 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
15d40 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
15d50 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
15d60 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
15d70 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
15d80 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
15d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15da0 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
15db0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
15dc0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
15dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15de0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15df0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15e00 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
15e10 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
15e20 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
15e30 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15e40 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
15e50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15e60 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15e70 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
15e80 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15e90 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
15ea0 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
15eb0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
15ec0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
15ed0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
15ee0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
15ef0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
15f00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
15f10 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
15f20 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
15f30 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
15f40 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
15f50 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
15f60 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
15f70 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
15f80 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
15f90 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
15fa0 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
15fb0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
15fc0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
15fd0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
15fe0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
15ff0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16000 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16010 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16030 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16040 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16050 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16060 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16070 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16080 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16090 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
160a0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
160b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
160c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
160d0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
160e0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
160f0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16100 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16110 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16120 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16130 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16140 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16150 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16160 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16170 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16180 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16190 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
161a0 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
161b0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
161c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
161d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
161e0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
161f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16210 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16220 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16230 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16240 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16250 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16260 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16270 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16280 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16290 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
162a0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
162b0 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
162c0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
162d0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
162e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
162f0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
16300 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16310 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
16320 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
16330 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
16340 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
16350 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
16360 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
16370 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
16380 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16390 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
163a0 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
163b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
163c0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
163d0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
163e0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
163f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16400 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
16410 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16420 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
16430 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
16440 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
16450 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16460 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
16470 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
16480 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
16490 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
164a0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
164b0 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
164c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
164d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
164e0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
164f0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
16500 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
16510 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16520 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16530 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
16540 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
16550 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16560 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
16570 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
16580 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16590 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
165a0 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
165b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
165c0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
165d0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
165e0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
165f0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
16600 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16610 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
16620 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
16630 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
16640 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
16650 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
16660 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
16670 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
16680 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
16690 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
166a0 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
166b0 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
166c0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
166d0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
166e0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
166f0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
16700 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
16710 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
16720 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
16730 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
16740 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
16750 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16760 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16770 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
16780 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
16790 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
167a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
167b0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
167c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
167d0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
167e0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
167f0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
16800 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
16810 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
16820 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
16830 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
16840 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
16850 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16860 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
16870 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
16880 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
16890 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
168a0 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
168b0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
168c0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
168d0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
168e0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
168f0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
16900 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
16910 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
16920 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
16930 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
16940 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
16950 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
16960 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
16970 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
16980 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
16990 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
169a0 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
169b0 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
169c0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
169d0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
169e0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
169f0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
16a00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16a10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16a20 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
16a30 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
16a40 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
16a50 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
16a60 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
16a70 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
16a80 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
16a90 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
16aa0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
16ab0 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
16ac0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
16ad0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16ae0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16af0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16b00 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
16b10 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
16b20 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
16b30 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16b40 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
16b50 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
16b60 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
16b70 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16b80 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
16b90 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
16ba0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
16bb0 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
16bc0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16bd0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
16be0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
16bf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
16c00 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
16c10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
16c20 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
16c30 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
16c40 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
16c50 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
16c60 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
16c70 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
16c80 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
16c90 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
16ca0 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
16cb0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
16cc0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
16cd0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
16ce0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
16cf0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
16d00 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
16d10 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
16d20 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
16d30 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
16d50 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
16d60 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
16d70 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
16d80 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
16d90 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
16da0 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
16db0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
16dc0 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
16dd0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
16de0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
16df0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
16e00 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
16e10 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
16e20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
16e30 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
16e40 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16e50 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
16e60 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
16e70 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
16e80 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
16e90 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
16ea0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16eb0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
16ec0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
16ed0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
16ee0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
16ef0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16f00 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
16f10 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
16f20 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
16f30 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
16f40 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
16f50 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
16f60 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
16f70 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
16f80 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
16f90 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
16fa0 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
16fb0 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
16fc0 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
16fd0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
16fe0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
16ff0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
17000 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
17010 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
17020 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17030 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17040 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
17050 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
17060 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
17070 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17080 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
17090 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
170a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
170b0 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
170c0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
170d0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
170e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
170f0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17100 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17110 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17120 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17150 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
17160 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
17170 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
17180 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17190 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
171c0 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
171d0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
171e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
171f0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
17200 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
17210 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
17220 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
17230 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
17240 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
17250 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17260 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
17270 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
17280 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
17290 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
172a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
172b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
172c0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
172d0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
172e0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
172f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17300 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
17310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17320 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
17330 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17360 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
17370 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17380 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
17390 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
173a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
173b0 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
173c0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
173d0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
173e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
173f0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
17400 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17410 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
17420 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
17430 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
17440 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
17450 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
17460 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
17470 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
17480 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
17490 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
174a0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
174b0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
174c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174d0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
174e0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
174f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
17500 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
17510 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
17520 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17530 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17540 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
17550 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17560 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17570 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17580 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17590 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
175a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
175b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
175c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
175d0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
175e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
175f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
17600 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
17620 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17630 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
17640 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
17650 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
17660 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
17670 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
17680 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
17690 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
176a0 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
176b0 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
176c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
176d0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
176e0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
176f0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
17700 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
17710 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
17720 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
17730 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
17740 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
17750 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17760 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
17770 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
17780 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
17790 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
177a0 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
177b0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
177c0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
177d0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
177e0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
177f0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
17800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17810 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
17820 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
17830 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
17840 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17850 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
17860 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17870 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17880 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
17890 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
178a0 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
178b0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
178c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
178d0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
178e0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
178f0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
17900 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17910 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
17920 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
17930 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
17940 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
17950 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
17960 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
17970 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
17980 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
17990 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
179a0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
179b0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
179c0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
179d0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
179e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
179f0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
17a00 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
17a10 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
17a20 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
17a30 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
17a40 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
17a50 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
17a60 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
17a70 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
17a80 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
17a90 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
17aa0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
17ab0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
17ac0 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
17ad0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
17ae0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
17af0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
17b00 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17b10 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
17b20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
17b30 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
17b40 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
17b50 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
17b60 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
17b70 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
17b80 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
17b90 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
17ba0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17bb0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17bc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17bd0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17be0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17bf0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17c00 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17c10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17c20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
17c30 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17c40 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
17c50 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
17c60 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
17c70 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17c80 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
17c90 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
17ca0 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
17cb0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
17cc0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
17cd0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
17ce0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
17cf0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17d00 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
17d10 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
17d20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
17d30 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
17d40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17d50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
17d60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
17d70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
17d80 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
17d90 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17da0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17db0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
17dc0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
17dd0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
17de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17df0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
17e00 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
17e10 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
17e20 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
17e30 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
17e40 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17e50 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
17e60 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17e70 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
17e80 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
17e90 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
17ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17eb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ec0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
17ed0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
17ee0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
17ef0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
17f00 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17f10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
17f20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
17f30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
17f40 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
17f50 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
17f60 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
17f70 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
17f80 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
17f90 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
17fa0 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
17fb0 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
17fc0 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
17fd0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
17fe0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
17ff0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
18000 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18010 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
18020 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18030 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18040 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
18050 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
18060 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
18070 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
18080 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18090 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
180a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
180b0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
180c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
180d0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
180e0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
180f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
18100 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18110 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18120 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18130 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
18140 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18150 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
18160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18170 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
18180 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18190 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
181a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
181b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
181c0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
181d0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
181e0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
181f0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
18200 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
18210 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
18220 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
18230 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
18240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
18250 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18260 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18270 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
18280 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18290 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
182a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
182b0 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
182c0 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
182d0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
182e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
182f0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
18300 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
18310 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18320 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
18330 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18340 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18350 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
18360 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18370 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
18380 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
18390 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
183a0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
183b0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
183c0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
183d0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
183e0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
183f0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
18400 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
18410 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18420 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
18430 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
18440 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18450 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
18460 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
18470 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
18480 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18490 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
184a0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
184b0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
184c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
184d0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
184e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
184f0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18500 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
18510 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
18520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
18530 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
18540 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
18550 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18570 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
18580 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18590 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
185a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
185b0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
185c0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
185d0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
185e0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
185f0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18600 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18610 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18620 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
18630 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
18640 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
18650 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
18660 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
18670 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
18680 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
18690 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
186a0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
186b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
186c0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
186d0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
186e0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
186f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18740 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
18750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18790 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
187a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187b0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
187c0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
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 2f 0a 0a 23 69 66 20 64  ********/..#if d
187f0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18800 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18810 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18820 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
18830 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18840 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
18850 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
18860 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
18870 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
18880 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
18890 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
188a0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
188b0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
188c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
188d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
188e0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
188f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
18900 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
18910 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18920 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
18930 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
18940 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18950 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
18960 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
18970 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
18980 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
18990 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
189a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
189b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
189c0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
189d0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
189e0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
189f0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18a00 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18a10 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18a20 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18a30 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18a40 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18a50 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18a60 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
18a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a80 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
18a90 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
18aa0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
18ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18b10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
18b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18b70 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
18b80 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
18b90 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
18bc0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
18bd0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
18be0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
18bf0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
18c00 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
18c10 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
18c20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
18c30 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
18c40 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
18c50 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
18c60 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
18c70 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
18c80 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
18c90 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
18ca0 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
18cb0 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
18cc0 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
18cd0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
18ce0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
18cf0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
18d00 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
18d10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
18d20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
18d30 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
18d40 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
18d50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18d60 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
18d70 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
18d80 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
18d90 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
18da0 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
18db0 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
18dc0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
18dd0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
18de0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
18df0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
18e00 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
18e10 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
18e20 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
18e30 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
18e40 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
18e50 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
18e60 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
18e70 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
18e80 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
18e90 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
18ea0 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
18eb0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
18ec0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
18ed0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
18ee0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
18ef0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
18f00 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
18f10 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
18f20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
18f30 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
18f40 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18f50 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
18f60 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
18f70 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
18f80 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
18f90 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
18fa0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
18fb0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
18fc0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
18fd0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
18fe0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
18ff0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
19000 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66    cnt &= 0x1ffff
19010 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
19020 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19030 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
19040 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19050 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19060 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19070 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19080 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19090 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
190a0 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
190b0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
190c0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
190d0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
190e0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
190f0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
19100 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
19110 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
19120 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19130 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
19140 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19150 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
19160 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
19170 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19180 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19190 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
191a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
191b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
191c0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
191d0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
191e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
191f0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19200 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19210 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19220 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19230 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19240 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19250 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19260 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19270 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19280 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19290 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  ;.      ((unixFi
192a0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
192b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
192c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
192d0 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
192e0 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
192f0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
19300 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
19310 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
19320 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
19330 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
19340 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
19350 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
19360 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
19370 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
19380 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19390 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
193a0 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
193b0 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
193c0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
193d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
193e0 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
193f0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
19400 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
19410 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
19420 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
19430 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
19440 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
19450 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
19460 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19470 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
19480 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
19490 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
194a0 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
194b0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
194c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
194d0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
194e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
194f0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
19500 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
19510 72 74 28 20 69 64 20 29 3b 0a 20 20 73 71 6c 69  rt( id );.  sqli
19520 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 70 20 3d  te3_int64 iMap =
19530 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46   0;         /* F
19540 69 6c 65 20 6f 66 66 73 65 74 20 6f 66 20 73 74  ile offset of st
19550 61 72 74 20 6f 66 20 6d 61 70 70 69 6e 67 20 69  art of mapping i
19560 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
19590 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
195a0 20 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 0a 20 20   mappings */..  
195b0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
195c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
195d0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
195e0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
195f0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
19600 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
19610 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
19620 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
19630 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
19640 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
19650 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
19660 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
19670 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
19680 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
19690 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
196a0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
196b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
196c0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
196d0 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
196e0 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
196f0 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
19700 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
19710 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
19720 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
19730 29 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ).  */.  for(i=0
19740 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
19750 20 75 6e 69 78 4d 61 70 70 69 6e 67 20 2a 70 4d   unixMapping *pM
19760 61 70 20 3d 20 26 70 46 69 6c 65 2d 3e 61 4d 6d  ap = &pFile->aMm
19770 61 70 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  ap[i];.    sqlit
19780 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20  e3_int64 iEnd = 
19790 69 4d 61 70 20 2b 20 70 4d 61 70 2d 3e 6d 6d 61  iMap + pMap->mma
197a0 70 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6f  pSize;.    if( o
197b0 66 66 73 65 74 3c 69 45 6e 64 20 29 7b 0a 20 20  ffset<iEnd ){.  
197c0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
197d0 6d 74 20 3c 3d 20 69 45 6e 64 20 29 7b 0a 20 20  mt <= iEnd ){.  
197e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
197f0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 4d 61 70  f, &((u8 *)(pMap
19800 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
19810 66 66 73 65 74 2d 69 4d 61 70 5d 2c 20 61 6d 74  ffset-iMap], amt
19820 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19830 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19850 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 69 45    int nCopy = iE
19860 6e 64 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  nd - offset;.   
19870 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
19880 2c 20 26 28 28 75 38 20 2a 29 28 70 4d 61 70 2d  , &((u8 *)(pMap-
19890 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
198a0 66 73 65 74 2d 69 4d 61 70 5d 2c 20 6e 43 6f 70  fset-iMap], nCop
198b0 79 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  y);.        pBuf
198c0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
198d0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 20  [nCopy];.       
198e0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
198f0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
19900 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a   nCopy;.      }.
19910 20 20 20 20 7d 0a 20 20 20 20 69 4d 61 70 20 3d      }.    iMap =
19920 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 3b   pMap->mmapSize;
19930 0a 20 20 7d 0a 0a 20 20 67 6f 74 20 3d 20 73 65  .  }..  got = se
19940 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
19950 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
19960 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
19970 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
19980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19990 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
199a0 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
199b0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
199c0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
199d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
199e0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
199f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19a00 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74  rrno = 0; /* not
19a10 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
19a20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
19a30 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
19a40 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
19a50 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
19a60 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
19a70 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
19a80 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
19a90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19aa0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
19ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
19ac0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
19ad0 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
19ae0 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
19af0 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
19b00 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19b10 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19b20 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
19b30 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  he offset..**.**
19b40 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
19b50 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
19b60 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77  ue on a failed w
19b70 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72  rite the lastErr
19b80 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
19b90 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
19ba0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
19bb0 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28  nt seekAndWrite(
19bc0 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36  unixFile *id, i6
19bd0 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20  4 offset, const 
19be0 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
19bf0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
19c00 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
19c10 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
19c20 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
19c30 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
19c40 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  set;.#endif.  as
19c50 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
19c60 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e  0x1ffff) );.  cn
19c70 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
19c80 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
19c90 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19ca0 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20  AD).  do{ got = 
19cb0 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20  osPwrite(id->h, 
19cc0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19cd0 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
19ce0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
19cf0 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
19d00 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19d10 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77    do{ got = osPw
19d20 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
19d30 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19d40 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26  ;}while( got<0 &
19d50 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b  & errno==EINTR);
19d60 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20  .#else.  do{.   
19d70 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
19d80 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
19d90 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
19da0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19db0 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
19dc0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
19dd0 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
19de0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
19df0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
19e00 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19e10 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
19e20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c  errno;.      }el
19e30 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e  se{.        ((un
19e40 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
19e50 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  tErrno = 0;.    
19e60 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
19e70 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
19e80 6f 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d  ot = osWrite(id-
19e90 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19ea0 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20    }while( got<0 
19eb0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
19ec0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
19ed0 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
19ee0 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
19ef0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
19f00 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19f10 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  }..  OSTRACE(("W
19f20 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
19f30 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
19f40 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
19f50 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
19f60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
19f70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
19f80 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
19f90 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
19fa0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
19fb0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
19fc0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
19fd0 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
19fe0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
19ff0 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1a000 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a010 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1a020 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1a030 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1a040 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1a050 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a060 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1a070 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1a080 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1a090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a0a0 74 3e 30 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  t>0 );.  int i;.
1a0b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a0c0 69 4d 61 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  iMap = 0;..  /* 
1a0d0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
1a0e0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
1a0f0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
1a100 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
1a110 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
1a120 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
1a130 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
1a140 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
1a150 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
1a160 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
1a170 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
1a180 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
1a190 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
1a1a0 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
1a1b0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
1a1c0 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
1a1d0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1a1e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1a1f0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1a200 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1a210 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1a220 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1a230 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f  .  ** doing a ho
1a240 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1a250 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1a260 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1a270 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72   than a.  ** nor
1a280 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1a290 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74  e) then record t
1a2a0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
1a2b0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68   database.  ** h
1a2c0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  as changed.  If 
1a2d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a2e0 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66  counter is modif
1a2f0 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74  ied, record that
1a300 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a  .  ** fact too..
1a310 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1a320 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
1a330 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  ){.    pFile->db
1a340 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20  Update = 1;  /* 
1a350 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  The database has
1a360 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a   been modified *
1a370 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
1a380 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61  <=24 && offset+a
1a390 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20  mt>=27 ){.      
1a3a0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
1a3b0 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20  ar oldCntr[4];. 
1a3c0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1a3d0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1a3e0 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e       rc = seekAn
1a3f0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c  dRead(pFile, 24,
1a400 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20   oldCntr, 4);.  
1a410 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1a420 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1a430 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c      if( rc!=4 ||
1a440 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c   memcmp(oldCntr,
1a450 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1a460 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d  24-offset], 4)!=
1a470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
1a480 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1a490 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74  g = 1;  /* The t
1a4a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1a4b0 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a  er has changed *
1a4c0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
1a4d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f    }.#endif..  fo
1a4e0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
1a4f0 7b 0a 20 20 20 20 75 6e 69 78 4d 61 70 70 69 6e  {.    unixMappin
1a500 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 69 6c 65  g *pMap = &pFile
1a510 2d 3e 61 4d 6d 61 70 5b 69 5d 3b 0a 20 20 20 20  ->aMmap[i];.    
1a520 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
1a530 6e 64 20 3d 20 69 4d 61 70 20 2b 20 70 4d 61 70  nd = iMap + pMap
1a540 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20 20 20  ->mmapSize;.    
1a550 69 66 28 20 6f 66 66 73 65 74 3c 69 45 6e 64 20  if( offset<iEnd 
1a560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ){.      if( off
1a570 73 65 74 2b 61 6d 74 20 3c 3d 20 69 45 6e 64 20  set+amt <= iEnd 
1a580 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1a590 79 28 26 28 28 75 38 20 2a 29 28 70 4d 61 70 2d  y(&((u8 *)(pMap-
1a5a0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1a5b0 66 73 65 74 2d 69 4d 61 70 5d 2c 20 70 42 75 66  fset-iMap], pBuf
1a5c0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  , amt);.        
1a5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a5e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a5f0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
1a600 20 3d 20 69 45 6e 64 20 2d 20 6f 66 66 73 65 74   = iEnd - offset
1a610 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1a620 28 26 28 28 75 38 20 2a 29 28 70 4d 61 70 2d 3e  (&((u8 *)(pMap->
1a630 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1a640 73 65 74 2d 69 4d 61 70 5d 2c 20 70 42 75 66 2c  set-iMap], pBuf,
1a650 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
1a660 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1a670 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1a680 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1a690 70 79 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  py;.        offs
1a6a0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1a6b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1a6c0 4d 61 70 20 3d 20 70 4d 61 70 2d 3e 6d 6d 61 70  Map = pMap->mmap
1a6d0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
1a6e0 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
1a6f0 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1a700 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1a710 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
1a720 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1a730 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1a740 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1a750 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1a760 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1a770 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a780 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1a790 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1a7a0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1a7b0 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1a7c0 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1a7d0 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
1a7e0 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1a7f0 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1a800 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1a810 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1a820 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1a830 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a840 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1a850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a860 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1a870 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
1a880 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
1a890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a8a0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1a8b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1a8c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a8d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1a8e0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1a8f0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
1a900 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
1a910 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
1a920 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
1a930 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
1a940 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
1a950 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
1a960 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
1a970 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1a980 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
1a990 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1a9a0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
1a9b0 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
1a9c0 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
1a9d0 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
1a9e0 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
1a9f0 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
1aa00 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
1aa10 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
1aa20 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
1aa30 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72  (slightly slower
1aa40 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66  ).** fsync(). If
1aa50 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
1aa60 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
1aa70 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
1aa80 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
1aa90 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
1aaa0 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
1aab0 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
1aac0 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1aad0 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65  (fdatasync).# de
1aae0 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1aaf0 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1ab00 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1ab10 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1ab20 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1ab30 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1ab40 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1ab50 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1ab60 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1ab70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1ab80 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1ab90 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1aba0 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1abb0 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1abc0 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1abd0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1abe0 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1abf0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1ac00 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1ac10 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1ac20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1ac30 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1ac40 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1ac50 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1ac60 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1ac70 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1ac80 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1ac90 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1aca0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1acb0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1acc0 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1acd0 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1ace0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1acf0 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1ad00 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1ad10 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1ad20 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1ad30 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1ad40 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1ad50 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1ad60 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1ad70 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1ad80 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1ad90 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1ada0 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1adb0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1adc0 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1add0 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1ade0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1adf0 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1ae00 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1ae10 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1ae20 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1ae30 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1ae40 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1ae50 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1ae60 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1ae70 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1ae80 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1ae90 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1aea0 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1aeb0 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1aec0 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1aed0 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1aee0 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1aef0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1af00 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1af10 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1af20 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1af30 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1af40 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1af50 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1af60 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1af70 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1af80 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1af90 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1afa0 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1afb0 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1afc0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1afd0 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1afe0 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1aff0 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1b000 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1b010 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1b020 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1b030 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1b040 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1b050 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1b060 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1b070 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1b080 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1b090 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1b0a0 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1b0b0 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1b0c0 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1b0d0 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1b0e0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1b0f0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1b100 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1b110 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1b120 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1b130 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1b140 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1b150 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1b160 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b170 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1b180 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1b190 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1b1a0 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1b1b0 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1b1c0 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1b1d0 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1b1e0 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1b1f0 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1b200 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1b210 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1b220 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1b230 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1b240 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b250 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1b260 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1b270 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1b280 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1b290 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1b2a0 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1b2b0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1b2c0 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1b2d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1b2e0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1b2f0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1b300 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1b310 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1b320 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1b330 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1b340 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1b350 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1b360 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1b370 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1b380 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1b390 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1b3a0 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1b3b0 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1b3c0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1b3d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b3e0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1b3f0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1b400 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1b410 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1b420 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1b430 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1b440 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1b450 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1b460 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1b470 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1b480 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1b490 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1b4a0 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1b4b0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1b4c0 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1b4d0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1b4e0 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1b4f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b500 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1b510 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1b520 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1b530 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1b540 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1b550 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1b560 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1b570 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1b580 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1b590 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1b5a0 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1b5b0 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1b5c0 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1b5d0 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1b5e0 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1b5f0 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1b600 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1b610 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1b620 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1b630 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1b640 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1b650 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1b660 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1b670 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1b680 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1b690 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1b6a0 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1b6b0 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1b6c0 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1b6d0 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1b6e0 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1b6f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1b700 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1b710 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1b720 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1b730 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1b740 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1b750 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1b760 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1b770 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1b780 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1b790 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1b7a0 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1b7b0 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1b7c0 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1b7d0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1b7e0 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1b7f0 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1b800 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1b810 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1b820 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1b830 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1b840 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1b850 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1b860 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1b870 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1b880 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1b890 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b8a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1b8b0 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1b8c0 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1b8d0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1b8e0 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1b8f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1b900 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1b910 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1b920 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1b930 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1b940 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1b950 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1b960 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1b970 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1b980 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1b990 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1b9a0 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1b9b0 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1b9c0 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1b9d0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1b9e0 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1b9f0 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1ba00 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1ba10 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1ba20 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1ba30 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1ba40 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1ba50 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1ba60 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1ba70 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1ba80 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1ba90 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1baa0 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1bab0 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1bac0 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1bad0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1bae0 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1baf0 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1bb00 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1bb10 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1bb20 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1bb30 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1bb40 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1bb50 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1bb60 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1bb70 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1bb80 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1bb90 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1bba0 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1bbb0 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1bbc0 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1bbd0 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1bbe0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1bbf0 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1bc00 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1bc10 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1bc20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1bc30 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1bc40 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1bc50 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1bc60 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1bc70 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1bc80 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1bc90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1bca0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1bcb0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1bcc0 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1bcd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1bce0 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1bcf0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1bd00 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1bd10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1bd20 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1bd30 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1bd40 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1bd50 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1bd60 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1bd70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1bd80 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1bd90 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1bda0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1bdb0 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1bdc0 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1bdd0 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1bde0 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1bdf0 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1be00 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1be10 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1be20 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1be30 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1be40 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1be50 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
1be60 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1be70 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1be80 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1be90 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1bea0 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1beb0 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1bec0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1bed0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1bee0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1bef0 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1bf00 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1bf10 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1bf20 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1bf30 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1bf40 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1bf50 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1bf60 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1bf70 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1bf80 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1bf90 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1bfa0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1bfb0 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1bfc0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1bfd0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1bfe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1bff0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1c000 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1c010 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1c020 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1c030 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1c040 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1c050 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1c060 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1c070 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1c080 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1c090 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1c0a0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1c0b0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1c0c0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1c0d0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1c0e0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1c0f0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1c100 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1c110 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1c120 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1c130 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1c140 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c150 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1c160 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1c170 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1c180 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1c190 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1c1a0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1c1b0 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1c1c0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1c1d0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1c1e0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1c1f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c200 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1c210 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1c220 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c230 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1c240 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1c250 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1c260 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1c270 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1c280 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1c290 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1c2a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c2b0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1c2c0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1c2d0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1c2e0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1c2f0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1c300 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1c310 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1c320 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c330 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1c340 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1c350 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1c360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c370 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1c380 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1c390 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1c3a0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1c3b0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1c3c0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1c3d0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1c3e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c3f0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1c400 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1c410 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1c420 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1c430 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1c440 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1c450 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1c460 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1c470 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1c480 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1c490 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c4a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1c4b0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1c4c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c4d0 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1c4e0 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1c4f0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
1c500 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20   Also fsync the 
1c510 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1c520 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66  ning the file if
1c530 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61   the DIRSYNC fla
1c540 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20  g.  ** is set.  
1c550 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69  This is a one-ti
1c560 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20  me occurrence.  
1c570 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78  Many systems (ex
1c580 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a  amples: AIX).  *
1c590 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  * are unable to 
1c5a0 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72  fsync a director
1c5b0 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72  y, so ignore err
1c5c0 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63  ors on the fsync
1c5d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1c5e0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1c5f0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1c600 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66   ){.    int dirf
1c610 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  d;.    OSTRACE((
1c620 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76  "DIRSYNC %s (hav
1c630 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
1c640 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
1c650 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20  pFile->zPath,.  
1c660 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
1c670 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
1c680 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d  sync));.    rc =
1c690 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
1c6a0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1c6b0 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1c6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c6d0 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
1c6e0 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1c6f0 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1c700 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1c710 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1c720 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1c730 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c740 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
1c750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c760 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  K;.    }.    pFi
1c770 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1c780 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59   ~UNIXFILE_DIRSY
1c790 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NC;.  }.  return
1c7a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1c7b0 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
1c7c0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
1c7d0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
1c7e0 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1c7f0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
1c800 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
1c810 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1c820 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1c830 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
1c840 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1c850 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1c860 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1c870 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1c880 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
1c890 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
1c8a0 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
1c8b0 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
1c8c0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1c8d0 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
1c8e0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
1c8f0 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
1c900 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
1c910 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
1c920 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
1c930 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
1c940 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
1c950 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1c960 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
1c970 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1c980 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1c990 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
1c9a0 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
1c9b0 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
1c9c0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1c9d0 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
1c9e0 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
1c9f0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28  cate(pFile->h, (
1ca00 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
1ca10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
1ca20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1ca30 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1ca40 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1ca50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ca60 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1ca70 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1ca80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ca90 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
1caa0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1cab0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1cac0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1cad0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1cae0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1caf0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67   to.    ** doing
1cb00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1cb10 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1cb20 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1cb30 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20  other than a.   
1cb40 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1cb50 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65  ase file) and we
1cb60 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1cb70 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1cb80 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65  h,.    ** that e
1cb90 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74  ffectively updat
1cba0 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  es the change co
1cbb0 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67  unter.  This mig
1cbc0 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a  ht happen.    **
1cbd0 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20   when restoring 
1cbe0 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  a database using
1cbf0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
1cc00 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  from a zero-leng
1cc10 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65  th.    ** source
1cc20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cc30 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1cc40 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1cc50 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
1cc60 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1cc70 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1cc80 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
1cc90 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1cca0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1ccb0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1ccc0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1ccd0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1cce0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1ccf0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1cd00 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1cd10 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1cd20 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1cd30 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1cd40 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1cd50 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1cd60 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1cd70 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3e 3d      for(i=1; i>=
1cd80 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 75  0; i--){.      u
1cd90 6e 69 78 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70  nixMapping *pMap
1cda0 20 3d 20 26 70 46 69 6c 65 2d 3e 61 4d 6d 61 70   = &pFile->aMmap
1cdb0 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
1cdc0 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20  e3_int64 iEnd = 
1cdd0 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 20 2b  pMap->mmapSize +
1cde0 20 28 69 3d 3d 31 20 3f 20 70 4d 61 70 5b 2d 31   (i==1 ? pMap[-1
1cdf0 5d 2e 6d 6d 61 70 53 69 7a 65 20 3a 20 30 29 3b  ].mmapSize : 0);
1ce00 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65  .      if( nByte
1ce10 3c 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  <iEnd ){.       
1ce20 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 20   pMap->mmapSize 
1ce30 2d 3d 20 28 69 45 6e 64 20 2d 20 6e 42 79 74 65  -= (iEnd - nByte
1ce40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ce50 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 3c 30 20  Map->mmapSize<0 
1ce60 29 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65  ) pMap->mmapSize
1ce70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1ce80 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
1ce90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1cea0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1ceb0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1cec0 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1ced0 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1cee0 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1cef0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1cf00 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1cf10 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1cf20 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1cf30 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1cf40 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1cf50 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1cf60 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1cf70 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1cf80 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1cf90 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
1cfa0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1cfb0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1cfc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1cfd0 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70  _FSTAT;.  }.  *p
1cfe0 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69  Size = buf.st_si
1cff0 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f  ze;..  /* When o
1d000 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69  pening a zero-si
1d010 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ze database, the
1d020 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
1d030 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1d040 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20  writes a single 
1d050 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66  byte into that f
1d060 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
1d070 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75  work around a bu
1d080 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53  g.  ** in the OS
1d090 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  -X msdos filesys
1d0a0 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  tem.  In order t
1d0b0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1d0c0 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a   with upper.  **
1d0d0 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64   layers, we need
1d0e0 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20   to report this 
1d0f0 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72  file size as zer
1d100 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  o even though it
1d110 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20   is.  ** really 
1d120 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36  1.   Ticket #326
1d130 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70  0..  */.  if( *p
1d140 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65  Size==1 ) *pSize
1d150 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e   = 0;...  return
1d160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1d170 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1d180 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1d190 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1d1a0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  E__)./*.** Handl
1d1b0 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63  er for proxy-loc
1d1c0 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  king file-contro
1d1d0 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65  l verbs.  Define
1d1e0 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a  d below in the.*
1d1f0 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  * proxying locki
1d200 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  ng division..*/.
1d210 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1d220 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1d230 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f  te3_file*,int,vo
1d240 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  id*);.#endif../*
1d250 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
1d260 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1d270 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54  handle the SQLIT
1d280 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1d290 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72  T .** file-contr
1d2a0 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45  ol operation.  E
1d2b0 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62  nlarge the datab
1d2c0 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e  ase to nBytes in
1d2d0 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65   size.** (rounde
1d2e0 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74  d up to the next
1d2f0 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49   chunk-size).  I
1d300 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d310 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79  s already.** nBy
1d320 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74  tes or larger, t
1d330 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1d340 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1d350 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48  c int fcntlSizeH
1d360 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  int(unixFile *pF
1d370 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  ile, i64 nByte){
1d380 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d390 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69  Chunk>0 ){.    i
1d3a0 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  64 nSize;       
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3c0 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  Required file si
1d3d0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
1d3e0 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20   stat buf;      
1d3f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1d400 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76  to hold return v
1d410 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29  alues of fstat()
1d420 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20   */.   .    if( 
1d430 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
1d440 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e  , &buf) ) return
1d450 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1d460 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20  TAT;..    nSize 
1d470 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1d480 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1d490 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1d4a0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1d4b0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1d4c0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1d4d0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1d4e0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1d4f0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1d500 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1d510 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1d520 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1d530 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1d540 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1d550 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1d560 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1d570 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1d580 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1d590 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1d5a0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1d5b0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1d5c0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1d5d0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1d5e0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1d5f0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1d600 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1d610 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1d620 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1d630 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1d640 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1d650 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1d660 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1d670 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1d680 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1d690 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1d6a0 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1d6b0 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1d6c0 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1d6d0 20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20   it. First use. 
1d6e0 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74       ** ftruncat
1d6f0 65 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66  e() to set the f
1d700 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77  ile size, then w
1d710 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79  rite a single by
1d720 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  te to.      ** t
1d730 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20  he last byte in 
1d740 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69  each block withi
1d750 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
1d760 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20  egion. This.    
1d770 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1d780 20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20   technique used 
1d790 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c  by glibc to impl
1d7a0 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c  ement posix_fall
1d7b0 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  ocate().      **
1d7c0 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74   on systems that
1d7d0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1d7e0 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
1d7f0 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20  system call..   
1d800 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1d810 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1d820 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1d830 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1d840 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1d850 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1d860 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1d870 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1d880 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  o */..      if( 
1d890 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1d8a0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
1d8b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1d8c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d8d0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1d8e0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d8f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d900 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d910 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d920 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1d930 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1d940 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1d950 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1d960 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69  Blk-1;.      whi
1d970 6c 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  le( iWrite<nSize
1d980 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1d990 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1d9a0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1d9b0 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1d9c0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1d9d0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1d9e0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1d9f0 20 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b          iWrite +
1da00 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a  = nBlk;.      }.
1da10 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1da20 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d  ..  if( pFile->m
1da30 6d 61 70 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  mapLimit>0 ){.  
1da40 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71    int rc;.    sq
1da50 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 53 7a 20  lite3_int64 nSz 
1da60 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28  = nByte;.    if(
1da70 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
1da80 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 7a 20  =0 ){.      nSz 
1da90 3d 20 28 28 6e 53 7a 2b 70 46 69 6c 65 2d 3e 73  = ((nSz+pFile->s
1daa0 7a 53 79 73 70 61 67 65 2d 31 29 20 2f 20 70 46  zSyspage-1) / pF
1dab0 69 6c 65 2d 3e 73 7a 53 79 73 70 61 67 65 29 20  ile->szSyspage) 
1dac0 2a 20 70 46 69 6c 65 2d 3e 73 7a 53 79 73 70 61  * pFile->szSyspa
1dad0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 6f  ge;.      if( ro
1dae0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1daf0 46 69 6c 65 2d 3e 68 2c 20 6e 53 7a 29 20 29 7b  File->h, nSz) ){
1db00 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1db10 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1db20 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1db30 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1db40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1db50 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1db60 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1db70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1db80 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61  .    rc = unixMa
1db90 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 53 7a  pfile(pFile, nSz
1dba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1dbb0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dbc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1dbd0 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1dbe0 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61  inititially nega
1dbf0 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1dc00 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1dc10 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1dc20 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1dc30 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1dc40 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1dc50 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1dc60 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1dc70 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1dc80 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1dc90 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1dca0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1dcb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dcc0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1dcd0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1dce0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1dcf0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1dd00 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1dd10 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1dd20 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1dd30 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1dd40 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1dd50 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1dd60 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1dd70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1dd80 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1dd90 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1dda0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1ddb0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1ddc0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1ddd0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1dde0 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
1ddf0 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
1de00 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
1de10 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1de20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1de30 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1de40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1de50 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1de60 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
1de70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1de80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
1de90 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1dea0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1deb0 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1dec0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1ded0 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  = pFile->eFileLo
1dee0 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ck;.      return
1def0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1df00 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1df10 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
1df20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1df30 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  g = pFile->lastE
1df40 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
1df50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1df60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1df70 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
1df80 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
1df90 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
1dfa0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
1dfb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dfc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1dfd0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1dfe0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
1dff0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e000 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e010 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1e020 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65    rc = fcntlSize
1e030 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36  Hint(pFile, *(i6
1e040 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  4 *)pArg);.     
1e050 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e060 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1e070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e080 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e090 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
1e0a0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  WAL: {.      uni
1e0b0 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
1e0c0 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
1e0d0 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67  _WAL, (int*)pArg
1e0e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e100 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e110 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
1e120 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20  _OVERWRITE: {.  
1e130 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e140 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e150 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
1e160 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e180 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e190 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
1e1a0 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
1e1b0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
1e1c0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
1e1d0 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
1e1e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e1f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e200 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e210 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
1e220 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  AME: {.      cha
1e230 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69  r *zTFile = sqli
1e240 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c  te3_malloc( pFil
1e250 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
1e260 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ame );.      if(
1e270 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20   zTFile ){.     
1e280 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61     unixGetTempna
1e290 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  me(pFile->pVfs->
1e2a0 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69  mxPathname, zTFi
1e2b0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63  le);.        *(c
1e2c0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46  har**)pArg = zTF
1e2d0 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
1e2e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e2f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e300 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e310 5f 4d 4d 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _MMAP_LIMIT: {. 
1e320 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1e330 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70  Limit = *(i64*)p
1e340 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1e350 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e360 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1e370 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1e380 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
1e390 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
1e3a0 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
1e3b0 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
1e3c0 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
1e3d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e3e0 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
1e3f0 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
1e400 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
1e410 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
1e420 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
1e430 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
1e440 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
1e450 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e460 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1e470 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
1e480 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1e490 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
1e4a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e4b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1e4c0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
1e4d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e4e0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1e4f0 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
1e500 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
1e510 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
1e520 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
1e530 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
1e540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
1e550 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
1e560 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
1e570 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e580 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1e590 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1e5a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
1e5b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1e5c0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1e5d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e5e0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1e5f0 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1e600 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1e610 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1e620 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1e630 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1e640 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1e650 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1e660 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1e670 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1e680 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1e690 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1e6a0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1e6b0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1e6c0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1e6d0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1e6e0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1e6f0 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1e700 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1e710 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1e720 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1e730 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1e740 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1e750 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1e760 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
1e770 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
1e780 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1e790 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1e7a0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1e7b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1e7c0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1e7d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1e7e0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
1e7f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1e800 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
1e810 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
1e820 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
1e830 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
1e840 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
1e850 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
1e860 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
1e870 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
1e880 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
1e890 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1e8a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1e8b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e8c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e8d0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
1e8e0 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
1e8f0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1e900 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
1e910 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
1e920 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
1e930 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
1e940 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
1e950 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1e960 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1e970 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1e980 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1e990 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1e9a0 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
1e9b0 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
1e9c0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
1e9d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e9e0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e9f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ea00 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1ea10 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
1ea20 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
1ea30 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1ea40 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1ea50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1ea60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ea70 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1ea80 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1ea90 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
1eaa0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
1eab0 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1eac0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1ead0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1eae0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1eaf0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1eb00 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1eb10 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1eb40 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1eb50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1eb60 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1eb70 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1eb80 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1eb90 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1eba0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1ebd0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1ebe0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1ebf0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1ec00 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1ec10 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
1ec20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1ec30 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1ec40 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1ec50 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1ec60 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1ec70 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
1ec80 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
1ec90 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1eca0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
1ecb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1ecc0 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1ecd0 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
1ece0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1ecf0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1ed00 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1ed10 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1ed20 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1ed60 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1ed70 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1ed80 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1ed90 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1eda0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1edb0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1edf0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1ee00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1ee10 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1ee20 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1ee30 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
1ee40 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1ee50 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1ee60 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1ee70 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ee80 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1ee90 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1eea0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
1eeb0 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
1eec0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1eed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1eee0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1eef0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1ef00 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1ef10 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1ef20 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1ef50 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1ef60 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1ef70 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1ef80 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1ef90 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1efa0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1efb0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1efe0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1eff0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f000 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f010 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f020 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
1f030 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f040 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f050 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f060 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f070 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f080 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1f090 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1f0a0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1f0b0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1f0c0 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1f0d0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1f0e0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1f0f0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1f100 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1f110 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f120 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1f130 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1f140 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1f150 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1f190 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1f1a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1f1b0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1f1c0 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
1f1d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f1e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f1f0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f200 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f210 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f220 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1f230 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1f240 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1f250 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1f260 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1f270 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1f280 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1f290 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f2a0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1f2b0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f2c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f2d0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f2e0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f2f0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f300 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f330 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f340 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f350 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1f360 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f370 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f380 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1f390 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
1f3a0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
1f3b0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f3c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1f3d0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1f3e0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1f3f0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1f400 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f430 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1f440 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
1f450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
1f460 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
1f470 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
1f480 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1f490 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
1f4a0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
1f4b0 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
1f4c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1f4d0 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
1f4e0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
1f4f0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f500 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1f510 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f520 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1f530 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1f540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1f550 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f560 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
1f570 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
1f580 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1f590 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1f5a0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1f5b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
1f5c0 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
1f5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1f5e0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1f5f0 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
1f600 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
1f610 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
1f620 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69 6e 63  ntraversial sinc
1f630 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
1f640 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1f650 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
1f660 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
1f670 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
1f680 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
1f690 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
1f6a0 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
1f6b0 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
1f6c0 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
1f6d0 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
1f6e0 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
1f6f0 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
1f700 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
1f710 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
1f720 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
1f730 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
1f740 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
1f750 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
1f760 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
1f770 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
1f780 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
1f790 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
1f7a0 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
1f7b0 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
1f7c0 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
1f7d0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
1f7e0 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
1f7f0 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
1f800 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
1f810 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
1f820 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
1f830 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
1f840 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
1f850 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
1f860 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1f870 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1f880 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1f890 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
1f8a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1f8b0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
1f8c0 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1f8d0 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
1f8e0 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
1f8f0 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
1f900 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
1f910 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
1f920 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
1f930 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1f940 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
1f950 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
1f960 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1f970 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
1f980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1f990 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f9a0 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  AL.../*.** Objec
1f9b0 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
1f9c0 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
1f9d0 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
1f9e0 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
1f9f0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
1fa00 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
1fa10 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
1fa20 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
1fa30 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
1fa40 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
1fa50 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
1fa60 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
1fa70 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
1fa80 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
1fa90 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1faa0 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
1fab0 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
1fac0 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
1fad0 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
1fae0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1faf0 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
1fb00 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
1fb10 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
1fb20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
1fb30 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
1fb40 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
1fb50 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
1fb60 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
1fb70 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
1fb80 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
1fb90 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
1fba0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
1fbb0 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
1fbc0 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
1fbd0 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
1fbe0 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1fbf0 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
1fc00 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
1fc10 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
1fc20 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
1fc30 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1fc40 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
1fc50 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1fc60 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
1fc70 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
1fc80 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1fc90 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1fca0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
1fcb0 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
1fcc0 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
1fcd0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1fce0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
1fcf0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
1fd00 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
1fd10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1fd20 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1fd30 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
1fd40 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1fd50 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
1fd60 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
1fd70 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
1fd80 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
1fd90 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1fda0 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
1fdb0 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
1fdc0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
1fdd0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
1fde0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
1fdf0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
1fe00 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
1fe10 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
1fe20 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
1fe30 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1fe40 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
1fe50 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
1fe60 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
1fe70 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1fe80 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1fe90 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
1fea0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
1feb0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
1fec0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1fed0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1fee0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1fef0 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff10 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
1ff20 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
1ff30 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
1ff40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ff50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ff60 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
1ff70 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
1ff80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ff90 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
1ffa0 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
1ffb0 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1ffc0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
1ffd0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20  -only */.  char 
1ffe0 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  **apRegion;     
1fff0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
20000 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d  f mapped shared-
20010 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
20020 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20040 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
20050 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
20060 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
20070 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
20080 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
20090 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
200a0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
200b0 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  this */.#ifdef S
200c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
200d0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
200e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
200f0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
20100 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
20110 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
20120 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20130 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
20140 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65   held */.  u8 ne
20150 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
20160 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
20170 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e  ailable unixShm.
20180 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
20190 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  if.};../*.** Str
201a0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
201b0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
201c0 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
201d0 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
201e0 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
201f0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
20200 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20210 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
20220 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
20230 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
20240 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
20250 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
20260 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
20270 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a  unixShm.pFile.**
20280 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a      unixShm.id.*
20290 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
202a0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
202b0 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53  rite.  The unixS
202c0 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20  hm.pFile->mutex 
202d0 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
202e0 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
202f0 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
20300 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
20310 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69   unixShm {.  uni
20320 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20330 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75  de;     /* The u
20340 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68  nderlying unixSh
20350 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
20360 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74    unixShm *pNext
20370 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20380 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74  Next unixShm wit
20390 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53  h the same unixS
203a0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
203b0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
203c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
203d0 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e  f holding the un
203e0 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  ixShmNode mutex 
203f0 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  */.  u8 id;     
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
20420 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nnection within 
20430 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  its unixShmNode 
20440 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
20450 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20460 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
20470 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
20480 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204a0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
204b0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
204c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
204d0 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
204e0 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
204f0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
20500 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
20510 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
20520 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
20530 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
20540 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
20550 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
20560 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
20570 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
20580 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
20590 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
205a0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
205b0 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
205c0 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
205d0 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
205e0 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
205f0 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
20600 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
20610 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
20620 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
20630 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
20640 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
20650 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20660 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
20670 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
20680 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
20690 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
206a0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
206b0 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
206c0 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
206d0 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206f0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
20700 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
20710 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20730 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
20740 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
20750 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
20760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
20770 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
20780 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
20790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
207a0 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
207b0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
207c0 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
207d0 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
207e0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
207f0 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
20800 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
20810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20820 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
20830 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
20840 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
20850 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
20860 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
20870 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
20880 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
20890 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
208a0 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
208b0 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
208c0 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
208d0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
208e0 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
208f0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
20900 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
20910 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20920 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
20930 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
20940 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
20950 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
20960 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
20970 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
20980 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
20990 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
209a0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
209b0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
209c0 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
209d0 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
209e0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
209f0 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
20a00 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
20a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
20a20 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
20a30 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
20a40 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
20a50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20a60 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
20a70 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
20a80 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
20a90 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
20aa0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
20ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
20ad0 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
20ae0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
20af0 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
20b00 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
20b10 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
20b20 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
20b30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
20b40 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
20b50 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
20b60 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
20b70 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
20b80 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
20b90 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
20ba0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20bb0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
20bc0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
20bd0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
20be0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
20bf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20c00 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
20c10 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
20c20 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
20c30 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
20c40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20c50 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
20c60 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20c70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
20c80 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
20c90 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
20ca0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
20cb0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
20cc0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
20cd0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
20ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
20cf0 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
20d00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
20d10 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
20d20 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
20d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
20d40 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
20d50 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
20d60 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
20d70 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
20d80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
20d90 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
20da0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
20db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20dc0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
20dd0 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
20de0 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
20df0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
20e00 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
20e10 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
20e20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
20e30 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
20e40 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
20e50 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
20e60 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
20e70 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
20e80 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
20e90 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
20ea0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
20eb0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
20ec0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
20ed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
20ee0 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
20ef0 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
20f00 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
20f10 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
20f20 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
20f30 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
20f40 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
20f50 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
20f60 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
20f70 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
20f80 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
20f90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
20fa0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
20fb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
20fc0 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
20fd0 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
20fe0 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
20ff0 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
21000 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
21010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21030 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
21040 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
21050 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21060 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
21070 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
21080 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
21090 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
210a0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
210b0 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
210c0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
210d0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
210e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
210f0 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
21100 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
21110 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
21120 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
21130 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21140 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
21150 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
21160 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
21170 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
21180 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
21190 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
211a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
211b0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
211c0 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
211d0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
211e0 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
211f0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
21200 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
21210 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
21220 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
21230 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
21240 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
21250 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
21260 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
21270 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
21280 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
21290 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
212a0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
212b0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
212c0 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
212d0 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
212e0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
212f0 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
21300 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
21310 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
21320 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
21330 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
21340 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
21350 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
21360 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
21370 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21380 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
21390 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
213a0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
213b0 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
213c0 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
213d0 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
213e0 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
213f0 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
21400 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
21410 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
21420 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
21430 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
21440 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
21450 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
21460 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
21470 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
21480 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21490 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
214a0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
214b0 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
214c0 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
214d0 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
214e0 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
214f0 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
21500 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
21510 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
21520 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
21530 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21540 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
21550 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
21560 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
21570 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
21580 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
21590 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
215a0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
215b0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
215c0 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
215d0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
215e0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
215f0 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
21600 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
21610 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
21620 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
21630 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
21640 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
21650 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
21660 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
21670 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
21680 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
21690 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
216a0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
216b0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
216c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
216d0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
216e0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
216f0 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
21700 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
21710 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
21720 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
21730 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
21740 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
21750 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
21760 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
21770 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
21780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
21790 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
217a0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
217b0 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
217c0 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
217d0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
217e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
217f0 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
21800 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21810 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
21820 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
21830 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
21840 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
21850 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
21860 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
21870 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
21880 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
21890 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
218a0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
218b0 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
218c0 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
218d0 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
218e0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
218f0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
21900 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
21910 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
21920 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
21930 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
21940 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
21950 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
21960 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
21970 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
21980 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
21990 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
219a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
219d0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
219e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
219f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21a00 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
21a10 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
21a20 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
21a30 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21a40 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
21a50 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
21a60 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
21a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21a80 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
21a90 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
21aa0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21ab0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
21ac0 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
21ad0 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
21ae0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
21af0 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
21b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
21b10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
21b20 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
21b30 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
21b40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
21b50 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
21b60 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
21b70 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
21b80 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
21b90 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
21ba0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
21bb0 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
21bc0 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
21bd0 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
21be0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
21bf0 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
21c00 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
21c10 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
21c20 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
21c30 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
21c40 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
21c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c60 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
21c70 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
21c80 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
21c90 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
21ca0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
21cb0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
21cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21cd0 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
21ce0 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
21cf0 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
21d00 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
21d10 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
21d20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
21d30 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
21d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
21d50 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
21d60 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
21d70 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
21d80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
21da0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
21db0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
21dc0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
21dd0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
21de0 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
21df0 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
21e00 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
21e10 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
21e20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
21e30 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
21e40 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
21e50 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
21e60 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
21e70 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
21e80 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
21e90 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
21ea0 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
21eb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21ec0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
21ed0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
21ee0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
21ef0 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
21f00 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
21f10 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
21f20 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
21f30 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
21f40 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
21f50 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
21f60 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
21f70 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
21f80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21f90 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
21fa0 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21fd0 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
21fe0 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
22010 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
22020 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
22030 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22040 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
22050 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
22060 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
22070 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
22080 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
22090 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
220a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
220b0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
220c0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
220d0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
220e0 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
220f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
22100 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
22110 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
22120 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
22130 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
22140 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
22150 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
22160 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
22170 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22180 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
22190 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
221a0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
221b0 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
221c0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
221d0 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
221e0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
221f0 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
22200 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
22210 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
22220 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
22230 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
22240 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
22250 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
22260 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
22270 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
22280 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22290 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
222a0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
222b0 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
222c0 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
222d0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
222e0 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
222f0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22300 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
22310 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
22320 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
22330 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
22340 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22350 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
22360 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
22370 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
22380 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
22390 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
223a0 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
223b0 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
223c0 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
223d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
223e0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
223f0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
22400 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
22410 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
22420 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
22430 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
22440 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
22450 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
22460 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
22470 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
22480 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
22490 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
224a0 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
224b0 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
224c0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
224d0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
224e0 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
224f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
22500 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
22510 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
22520 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
22530 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
22540 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
22550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
22560 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
22570 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
22580 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
22590 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
225a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
225b0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
225c0 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
225d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
225e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
225f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22600 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
22610 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
22620 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
22630 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
22640 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
22650 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
22660 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22670 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22680 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
22690 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
226a0 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
226b0 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
226c0 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
226d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
226e0 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
226f0 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
22700 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
22710 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
22720 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
22730 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
22740 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
22750 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
22760 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
22770 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
22780 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
22790 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
227a0 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
227b0 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
227c0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
227d0 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
227e0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
227f0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
22800 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
22810 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
22820 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
22830 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
22840 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
22850 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
22860 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
22870 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
22880 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
22890 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
228a0 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
228b0 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
228c0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
228d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
228e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
228f0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
22900 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
22910 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
22920 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
22930 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
22940 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
22950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22960 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
22970 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
22980 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
22990 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
229a0 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
229b0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
229c0 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
229d0 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
229e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
229f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
22a00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22a10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22a20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
22a30 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
22a40 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
22a50 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
22a60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
22a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22a90 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
22aa0 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
22ab0 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
22ac0 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
22ad0 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
22ae0 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
22af0 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
22b00 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
22b10 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22b20 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
22b30 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
22b40 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
22b50 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
22b60 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
22b70 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
22b80 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
22b90 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
22ba0 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
22bb0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
22bc0 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
22bd0 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
22be0 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
22bf0 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
22c00 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
22c10 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
22c20 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
22c30 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
22c40 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
22c50 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
22c60 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
22c70 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
22c80 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
22c90 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
22ca0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
22cb0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
22cc0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
22cd0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
22ce0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
22cf0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
22d00 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
22d10 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
22d20 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
22d30 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
22d40 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
22d50 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
22d60 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
22d70 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
22d80 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22d90 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
22da0 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
22db0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
22dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22dd0 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
22de0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
22df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
22e00 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
22e10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
22e20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
22e50 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
22e60 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
22e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22e80 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
22e90 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
22ec0 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
22ed0 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
22ee0 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22f00 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
22f10 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
22f20 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
22f30 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
22f40 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
22f50 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
22f60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22f70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22f80 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
22f90 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
22fa0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
22fb0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
22fc0 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
22fd0 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
22fe0 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
22ff0 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
23000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
23020 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
23030 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
23040 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
23050 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
23060 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
23070 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
23080 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
23090 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
230a0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
230b0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
230c0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
230d0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
230e0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
230f0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
23100 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
23110 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
23120 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
23130 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
23140 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
23150 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
23160 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
23170 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
23180 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
23190 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
231c0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
231d0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
231e0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
231f0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
23200 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
23210 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
23220 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
23230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
23240 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
23250 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
23260 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
23270 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
23280 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
23290 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
232a0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
232b0 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
232c0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
232d0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
232e0 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
232f0 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
23300 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
23310 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
23320 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
23330 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
23340 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
23350 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
23360 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
23370 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
23380 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
23390 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
233a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
233b0 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
233c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
233d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
233e0 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
233f0 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
23400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
23410 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
23420 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
23430 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
23440 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
23450 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
23460 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
23470 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
23480 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
23490 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
234a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
234b0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
234c0 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
234d0 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61  rue, use ftrunca
234e0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
234f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23500 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
23510 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20   region..       
23520 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
23530 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20  !bExtend ) goto 
23540 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23 69 66  shmpage_out;.#if
23550 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
23560 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
23570 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
23580 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20 20 69  LOCATE.        i
23590 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70  f( osFallocate(p
235a0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
235b0 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79 74 65  t.st_size, nByte
235c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
235d0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
235e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
235f0 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c 6c 6f  _SHMSIZE, "fallo
23600 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20  cate",.         
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
23630 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
23640 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
23650 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  out;.        }.#
23660 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
23670 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
23680 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
23690 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
236a0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
236b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
236c0 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
236d0 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
23700 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23710 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23720 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
23730 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
23740 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
23750 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
23760 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
23770 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
23780 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
23790 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
237a0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
237b0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
237c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
237d0 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
237e0 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
237f0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
23800 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
23810 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
23820 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
23830 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
23840 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
23850 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
23860 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
23870 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
23880 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
23890 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
238a0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
238b0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
238c0 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70     pMem = osMmap
238d0 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20  (0, szRegion,.  
238e0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
238f0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
23900 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
23910 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
23920 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
23930 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
23940 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f  Node->h, szRegio
23950 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d  n*(i64)pShmNode-
23960 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20  >nRegion.       
23970 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
23980 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pMem==MAP_FAILED
23990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
239a0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
239b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
239c0 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68  MAP, "mmap", pSh
239d0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
239e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
239f0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
23a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
23a20 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  em = sqlite3_mal
23a30 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  loc(szRegion);. 
23a40 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
23a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23a60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
23a70 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
23a80 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
23a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23aa0 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
23ab0 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
23ac0 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f    }.      pShmNo
23ad0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
23ae0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20  mNode->nRegion] 
23af0 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53  = pMem;.      pS
23b00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
23b10 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
23b20 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
23b30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23b40 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
23b50 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
23b60 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
23b70 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
23b80 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
23b90 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
23ba0 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
23bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
23bc0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
23bd0 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
23be0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
23bf0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
23c00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23c10 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
23c20 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
23c30 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
23c40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
23c50 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
23c60 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
23c70 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
23c80 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
23c90 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
23ca0 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
23cb0 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
23cc0 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
23cd0 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
23ce0 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
23cf0 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
23d00 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
23d10 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
23d20 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
23d30 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
23d40 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
23d50 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
23d60 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
23d70 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
23d80 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
23d90 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
23da0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
23db0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
23dc0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
23dd0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
23de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23df0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
23e00 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
23e10 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
23e40 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
23e50 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
23e60 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
23e70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
23e80 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
23e90 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
23ea0 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
23eb0 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
23ec0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
23ed0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
23ee0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
23ef0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
23f00 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
23f10 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
23f20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
23f30 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
23f40 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f60 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
23f70 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
23f80 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
23f90 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
23fa0 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
23fb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
23fc0 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
23fd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
24000 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24030 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
24040 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
24050 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24060 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
24070 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
24080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24090 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
240a0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
240b0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
240c0 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
240d0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
240e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
240f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
24100 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
24110 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
24120 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
24130 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
24140 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
24150 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
24160 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
24170 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
24180 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
24190 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
241a0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
241b0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
241c0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
241d0 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
241e0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
241f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
24200 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
24210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24220 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
24230 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
24240 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
24250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24260 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
24270 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24280 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
24290 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
242a0 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
242b0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
242c0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
242d0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
242e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
242f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
24300 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
24310 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
24320 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
24330 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
24340 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
24350 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
24360 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
24370 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
24380 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
24390 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
243a0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
243b0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
243c0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
243d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
243e0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
243f0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
24400 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
24410 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
24420 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
24430 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
24440 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
24450 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
24460 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
24470 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
24480 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
24490 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
244a0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
244b0 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  e, F_UNLCK, ofst
244c0 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
244d0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
244e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
244f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
24500 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
24510 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
24520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24530 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
24540 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
24550 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
24560 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
24570 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
24580 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
24590 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
245a0 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
245b0 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
245c0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
245d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
245e0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
245f0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
24600 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
24610 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
24620 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
24630 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
24640 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
24650 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
24660 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
24670 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
24680 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
24690 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
246a0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
246b0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
246c0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
246d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
246e0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
246f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
24700 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
24710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
24720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
24730 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
24740 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
24750 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
24760 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
24770 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
24780 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
24790 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
247a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
247b0 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
247c0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
247d0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
247e0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
247f0 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  de, F_RDLCK, ofs
24800 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
24810 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
24820 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
24840 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24850 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
24860 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
24870 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24880 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
24890 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
248a0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
248b0 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
248c0 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
248d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
248e0 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
248f0 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
24900 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
24910 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
24920 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
24930 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
24940 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
24950 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
24960 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
24970 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
24980 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
24990 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
249a0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
249b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
249c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
249d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
249e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
249f0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
24a00 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
24a10 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
24a20 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
24a30 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
24a40 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
24a50 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
24a60 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
24a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
24a90 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
24aa0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
24ab0 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  WRLCK, ofst+UNIX
24ac0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
24ad0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24af0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
24b00 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
24b10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
24b20 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
24b30 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
24b40 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
24b50 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
24b60 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
24b70 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
24b80 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
24b90 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
24ba0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
24bb0 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
24bc0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
24bd0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
24be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24bf0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
24c00 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
24c10 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
24c20 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
24c30 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
24c40 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
24c50 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
24c60 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
24c70 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
24c80 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
24c90 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
24ca0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
24cb0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
24cc0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
24cd0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cf0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
24d00 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24d10 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
24d20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24d30 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  (fd);.  unixEnte
24d40 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78  rMutex();.  unix
24d50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
24d60 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
24d70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
24d80 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
24d90 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
24da0 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
24db0 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
24dc0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
24dd0 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
24de0 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
24df0 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
24e00 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
24e10 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
24e20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
24e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24e40 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
24e50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
24e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24e70 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
24e80 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
24e90 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
24ea0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
24eb0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
24ec0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
24ed0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
24ee0 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f00 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
24f10 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
24f20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
24f30 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
24f40 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
24f50 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
24f60 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
24f70 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
24f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24f90 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
24fa0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
24fb0 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
24fc0 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
24fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
24fe0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
24ff0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
25000 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
25010 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
25020 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
25030 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
25040 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
25050 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
25060 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
25070 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
25080 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
25090 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
250a0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
250b0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
250c0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
250d0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
250e0 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
250f0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
25100 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
25110 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
25120 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
25130 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
25140 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
25150 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
25160 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
25170 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
25180 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
25190 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
251a0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
251b0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
251c0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
251d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
251e0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
251f0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
25200 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
25210 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
25220 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
25230 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
25240 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
25250 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
25260 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
25270 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
25280 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
25290 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
252a0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
252b0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
252c0 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
252d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
252e0 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   osUnlink(pShmNo
252f0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
25300 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
25310 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
25320 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25330 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
25340 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
25350 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
25360 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
25370 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
25380 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
25390 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
253a0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
253b0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
253c0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
253d0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
253e0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
253f0 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
25400 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
25410 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
25420 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
25430 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
25440 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
25450 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
25460 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  hOut==0 );.  for
25470 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
25480 0a 20 20 20 20 75 6e 69 78 4d 61 70 70 69 6e 67  .    unixMapping
25490 20 2a 70 4d 61 70 20 3d 20 26 70 46 64 2d 3e 61   *pMap = &pFd->a
254a0 4d 6d 61 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Mmap[i];.    if(
254b0 20 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f   pMap->pMapRegio
254c0 6e 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  n ){.      osMun
254d0 6d 61 70 28 70 4d 61 70 2d 3e 70 4d 61 70 52 65  map(pMap->pMapRe
254e0 67 69 6f 6e 2c 20 70 4d 61 70 2d 3e 6d 6d 61 70  gion, pMap->mmap
254f0 4f 72 69 67 73 69 7a 65 29 3b 0a 20 20 20 20 20  Origsize);.     
25500 20 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f   pMap->pMapRegio
25510 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 61  n = 0;.      pMa
25520 70 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  p->mmapSize = 0;
25530 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6d 6d 61  .      pMap->mma
25540 70 4f 72 69 67 73 69 7a 65 20 3d 20 30 3b 0a 20  pOrigsize = 0;. 
25550 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
25560 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
25570 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 73 6f  tem page size so
25580 6d 65 68 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  mehow..*/.static
25590 20 69 6e 74 20 75 6e 69 78 47 65 74 50 61 67 65   int unixGetPage
255a0 73 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  size(void){.  re
255b0 74 75 72 6e 20 34 30 39 36 3b 0a 7d 0a 0a 2f 2a  turn 4096;.}../*
255c0 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
255d0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
255e0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
255f0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
25600 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
25610 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
25620 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
25630 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
25640 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
25650 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
25660 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
25670 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
25680 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
25690 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
256a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
256b0 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
256c0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
256d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
256e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
256f0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
25700 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
25710 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
25720 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
25730 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
25740 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
25750 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
25760 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
25770 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
25780 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
25790 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
257a0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
257b0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
257c0 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
257d0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
257e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
257f0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
25800 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
25810 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
25820 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
25830 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
25840 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
25850 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
25860 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
25870 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
25880 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
25890 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
258a0 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
258b0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
258c0 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
258d0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
258e0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
258f0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
25900 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
25910 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
25920 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  i64 nMap = nByte
25930 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
25940 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
25950 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
25960 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
25970 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
25980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25990 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
259a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
259b0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
259c0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
259d0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
259e0 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
259f0 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26  sFstat(pFd->h, &
25a00 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
25a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25a20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25a30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
25a40 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
25a50 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
25a60 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
25a70 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69  nMap>pFd->mmapLi
25a80 6d 69 74 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  mit ){.    nMap 
25a90 3d 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74  = pFd->mmapLimit
25aa0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61  ;.  }..  if( nMa
25ab0 70 21 3d 28 70 46 64 2d 3e 61 4d 6d 61 70 5b 30  p!=(pFd->aMmap[0
25ac0 5d 2e 6d 6d 61 70 53 69 7a 65 20 2b 20 70 46 64  ].mmapSize + pFd
25ad0 2d 3e 61 4d 6d 61 70 5b 31 5d 2e 6d 6d 61 70 53  ->aMmap[1].mmapS
25ae0 69 7a 65 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  ize) ){.    void
25af0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 20   *pNew = 0;..   
25b00 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
25b10 73 74 20 69 73 20 66 6f 72 20 61 20 6d 61 70 70  st is for a mapp
25b20 69 6e 67 20 7a 65 72 6f 20 62 79 74 65 73 20 69  ing zero bytes i
25b30 6e 20 73 69 7a 65 2c 20 6f 72 20 74 68 65 72 65  n size, or there
25b40 20 61 72 65 20 0a 20 20 20 20 20 2a 2a 20 63 75   are .     ** cu
25b50 72 72 65 6e 74 6c 79 20 61 6c 72 65 61 64 79 20  rrently already 
25b60 74 77 6f 20 6d 61 70 70 69 6e 67 20 72 65 67 69  two mapping regi
25b70 6f 6e 73 2c 20 6f 72 20 74 68 65 72 65 20 69 73  ons, or there is
25b80 20 61 6c 72 65 61 64 79 20 61 20 6d 61 70 70 69   already a mappi
25b90 6e 67 0a 20 20 20 20 20 2a 2a 20 72 65 67 69 6f  ng.     ** regio
25ba0 6e 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  n that is not a 
25bb0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
25bc0 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 73 69 7a  page-size in siz
25bd0 65 2c 20 75 6e 6d 61 70 0a 20 20 20 20 20 2a 2a  e, unmap.     **
25be0 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 2a 2f   everything.  */
25bf0 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30  .    if( nMap==0
25c00 20 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 4d   .#ifndef HAVE_M
25c10 52 45 4d 41 50 0a 20 20 20 20 20 20 20 20 7c 7c  REMAP.        ||
25c20 20 28 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e   (pFd->aMmap[0].
25c30 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 70 46  pMapRegion && pF
25c40 64 2d 3e 61 4d 6d 61 70 5b 31 5d 2e 70 4d 61 70  d->aMmap[1].pMap
25c50 52 65 67 69 6f 6e 29 20 0a 20 20 20 20 20 20 20  Region) .       
25c60 20 7c 7c 20 28 70 46 64 2d 3e 61 4d 6d 61 70 5b   || (pFd->aMmap[
25c70 30 5d 2e 6d 6d 61 70 53 69 7a 65 20 25 20 70 46  0].mmapSize % pF
25c80 64 2d 3e 73 7a 53 79 73 70 61 67 65 29 0a 23 65  d->szSyspage).#e
25c90 6e 64 69 66 0a 20 20 20 20 20 20 29 7b 0a 20 20  ndif.      ){.  
25ca0 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
25cb0 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pFd);.    }.  
25cc0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 61    assert( pFd->a
25cd0 4d 6d 61 70 5b 31 5d 2e 70 4d 61 70 52 65 67 69  Mmap[1].pMapRegi
25ce0 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  on==0 );..    if
25cf0 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20  ( nMap>0 ){.    
25d00 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
25d10 4f 54 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 69  OT_READ;.      i
25d20 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61  f( (pFd->ctrlFla
25d30 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
25d40 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73  ONLY)==0 ) flags
25d50 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a   |= PROT_WRITE;.
25d60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
25d70 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
25d80 20 6e 6f 20 6d 61 70 70 69 6e 67 73 2c 20 63 72   no mappings, cr
25d90 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
25da0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 46 64 2d  /.      if( pFd-
25db0 3e 61 4d 6d 61 70 5b 30 5d 2e 70 4d 61 70 52 65  >aMmap[0].pMapRe
25dc0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
25dd0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
25de0 28 30 2c 20 6e 4d 61 70 2c 20 66 6c 61 67 73 2c  (0, nMap, flags,
25df0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 46 64   MAP_SHARED, pFd
25e00 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ->h, 0);.       
25e10 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
25e20 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
25e30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25e40 5f 49 4f 45 52 52 5f 4d 4d 41 50 3b 0a 20 20 20  _IOERR_MMAP;.   
25e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25e60 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 70 4d 61  Fd->aMmap[0].pMa
25e70 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a  pRegion = pNew;.
25e80 20 20 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d          pFd->aMm
25e90 61 70 5b 30 5d 2e 6d 6d 61 70 53 69 7a 65 20 3d  ap[0].mmapSize =
25ea0 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 20 20 70   nMap;.        p
25eb0 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 6d 6d 61  Fd->aMmap[0].mma
25ec0 70 4f 72 69 67 73 69 7a 65 20 3d 20 6e 4d 61 70  pOrigsize = nMap
25ed0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
25ee0 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
25ef0 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
25f00 20 61 6e 20 6d 72 65 6d 61 70 28 29 20 63 61 6c   an mremap() cal
25f10 6c 2c 20 72 65 73 69 7a 65 20 74 68 65 20 65 78  l, resize the ex
25f20 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 2e 20  isting mapping. 
25f30 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  */.      else{. 
25f40 20 20 20 20 20 20 20 75 6e 69 78 4d 61 70 70 69         unixMappi
25f50 6e 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 64 2d  ng *pMap = &pFd-
25f60 3e 61 4d 6d 61 70 5b 30 5d 3b 0a 20 20 20 20 20  >aMmap[0];.     
25f70 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d     pNew = osMrem
25f80 61 70 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ap(.            
25f90 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  pMap->pMapRegion
25fa0 2c 20 70 4d 61 70 2d 3e 6d 6d 61 70 4f 72 69 67  , pMap->mmapOrig
25fb0 73 69 7a 65 2c 20 6e 4d 61 70 2c 20 4d 52 45 4d  size, nMap, MREM
25fc0 41 50 5f 4d 41 59 4d 4f 56 45 0a 20 20 20 20 20  AP_MAYMOVE.     
25fd0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25fe0 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
25ff0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
26000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26010 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3b 0a 20 20  E_IOERR_MMAP;.  
26020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26030 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 70 4d  pFd->aMmap[0].pM
26040 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
26050 0a 20 20 20 20 20 20 20 20 70 46 64 2d 3e 61 4d  .        pFd->aM
26060 6d 61 70 5b 30 5d 2e 6d 6d 61 70 53 69 7a 65 20  map[0].mmapSize 
26070 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 20 20  = nMap;.        
26080 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 6d 6d  pFd->aMmap[0].mm
26090 61 70 4f 72 69 67 73 69 7a 65 20 3d 20 6e 4d 61  apOrigsize = nMa
260a0 70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  p;.      }.#else
260b0 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
260c0 69 73 65 2c 20 63 72 65 61 74 65 20 61 20 73 65  ise, create a se
260d0 63 6f 6e 64 20 6d 61 70 70 69 6e 67 2e 20 49 66  cond mapping. If
260e0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
260f0 70 70 69 6e 67 20 69 73 0a 20 20 20 20 20 20 2a  pping is.      *
26100 2a 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  * a multiple of 
26110 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 6e  the page-size in
26120 20 73 69 7a 65 2c 20 74 68 65 6e 20 72 65 71 75   size, then requ
26130 65 73 74 20 74 68 61 74 20 74 68 65 20 6e 65 77  est that the new
26140 0a 20 20 20 20 20 20 2a 2a 20 6d 61 70 70 69 6e  .      ** mappin
26150 67 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  g immediately fo
26160 6c 6c 6f 77 20 74 68 65 20 6f 6c 64 20 69 6e 20  llow the old in 
26170 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 2e 20  virtual memory. 
26180 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a   */.      else{.
26190 20 20 20 20 20 20 20 20 75 6e 69 78 4d 61 70 70          unixMapp
261a0 69 6e 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 64  ing *pMap = &pFd
261b0 2d 3e 61 4d 6d 61 70 5b 30 5d 3b 0a 20 20 20 20  ->aMmap[0];.    
261c0 20 20 20 20 76 6f 69 64 20 2a 70 41 64 64 72 20      void *pAddr 
261d0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 6e 4d  = 0;..        nM
261e0 61 70 20 2d 3d 20 70 4d 61 70 2d 3e 6d 6d 61 70  ap -= pMap->mmap
261f0 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  Size;..        i
26200 66 28 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a  f( pMap->mmapSiz
26210 65 3d 3d 70 4d 61 70 2d 3e 6d 6d 61 70 4f 72 69  e==pMap->mmapOri
26220 67 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gsize ){.       
26230 20 20 20 70 41 64 64 72 20 3d 20 28 76 6f 69 64     pAddr = (void
26240 20 2a 29 26 28 28 75 38 20 2a 29 70 4d 61 70 2d   *)&((u8 *)pMap-
26250 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 70 4d 61  >pMapRegion)[pMa
26260 70 2d 3e 6d 6d 61 70 53 69 7a 65 5d 3b 0a 20 20  p->mmapSize];.  
26270 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26280 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70   pNew = osMmap(p
26290 41 64 64 72 2c 20 6e 4d 61 70 2c 20 66 6c 61 67  Addr, nMap, flag
262a0 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70  s, MAP_SHARED, p
262b0 46 64 2d 3e 68 2c 20 70 4d 61 70 2d 3e 6d 6d 61  Fd->h, pMap->mma
262c0 70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  pSize);.        
262d0 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
262e0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
262f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26300 49 4f 45 52 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  IOERR_MMAP;.    
26310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26320 28 20 70 4e 65 77 3d 3d 70 41 64 64 72 20 29 7b  ( pNew==pAddr ){
26330 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d  .          pMap-
26340 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20 2b 3d  >mmapOrigsize +=
26350 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 20 20 20   nMap;.         
26360 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 20   pMap->mmapSize 
26370 2b 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 20  += nMap;.       
26380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26390 20 20 70 46 64 2d 3e 61 4d 6d 61 70 5b 31 5d 2e    pFd->aMmap[1].
263a0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
263b0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 64  w;.          pFd
263c0 2d 3e 61 4d 6d 61 70 5b 31 5d 2e 6d 6d 61 70 53  ->aMmap[1].mmapS
263d0 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20  ize = nMap;.    
263e0 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d 61 70        pFd->aMmap
263f0 5b 31 5d 2e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  [1].mmapOrigsize
26400 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 20   = nMap;.       
26410 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
26420 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  f.    }.  }..  r
26430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  .}../*.** If pos
26450 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
26460 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
26470 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
26480 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
26490 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
264a0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
264b0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
264c0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
264d0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
264e0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
264f0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
26500 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
26510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
26520 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
26530 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
26540 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
26550 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
26560 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
26570 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
26580 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
26590 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
265a0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
265b0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
265c0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
265d0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
265e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
265f0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
26600 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
26610 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
26620 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
26630 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
26640 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
26650 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
26660 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26670 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
26680 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
26690 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
266a0 20 2a 2a 70 70 29 7b 0a 20 20 75 6e 69 78 46 69   **pp){.  unixFi
266b0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
266c0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
266d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
266e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
266f0 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28   *pp = 0;..  if(
26700 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3e   pFd->mmapLimit>
26710 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
26720 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
26730 34 20 69 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20  4 iMap = 0;.    
26740 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 61 4d  .    if( pFd->aM
26750 6d 61 70 5b 30 5d 2e 70 4d 61 70 52 65 67 69 6f  map[0].pMapRegio
26760 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
26770 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
26780 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
26790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
267a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
267b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
267c0 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
267d0 0a 20 20 20 20 20 20 75 6e 69 78 4d 61 70 70 69  .      unixMappi
267e0 6e 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 64 2d  ng *pMap = &pFd-
267f0 3e 61 4d 6d 61 70 5b 69 5d 3b 0a 20 20 20 20 20  >aMmap[i];.     
26800 20 69 66 28 20 69 4f 66 66 3e 3d 69 4d 61 70 20   if( iOff>=iMap 
26810 26 26 20 69 4f 66 66 2b 6e 41 6d 74 3c 3d 28 69  && iOff+nAmt<=(i
26820 4d 61 70 20 2b 20 70 4d 61 70 2d 3e 6d 6d 61 70  Map + pMap->mmap
26830 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
26840 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
26850 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  Map->pMapRegion)
26860 5b 69 4f 66 66 2d 69 4d 61 70 5d 3b 0a 20 20 20  [iOff-iMap];.   
26870 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68       pFd->nFetch
26880 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Out++;.        b
26890 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
268a0 20 20 20 20 69 4d 61 70 20 3d 20 70 4d 61 70 2d      iMap = pMap-
268b0 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20 20 20 7d  >mmapSize;.    }
268c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
268d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
268e0 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
268f0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
26900 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
26910 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
26920 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
26930 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
26940 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
26950 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65  unixFetch(). The
26960 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
26970 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
26980 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
26990 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
269a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
269b0 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
269c0 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
269d0 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29   the unixFetch()
269e0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a   invocation. .**
269f0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
26a00 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
26a10 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
26a20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
26a30 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f  ng called .** to
26a40 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20   inform the VFS 
26a50 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f  layer that, acco
26a60 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20  rding to POSIX, 
26a70 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  any existing map
26a80 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77  ping .** may now
26a90 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
26aa0 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
26ab0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26ac0 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71  t unixUnfetch(sq
26ad0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
26ae0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
26af0 70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  p){.  unixFile *
26b00 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
26b10 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
26b20 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
26b30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  se file */..  /*
26b40 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
26b50 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
26b60 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
26b70 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
26b80 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
26b90 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
26ba0 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
26bb0 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
26bc0 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
26bd0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
26be0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
26bf0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
26c00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
26c10 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
26c20 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
26c30 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
26c40 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
26c50 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 23 69  f value. */.  #i
26c60 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 3d  f 0.  assert( p=
26c70 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
26c80 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
26c90 29 5b 69 4f 66 66 5d 20 29 3b 0a 20 20 23 65 6e  )[iOff] );.  #en
26ca0 64 69 66 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a  dif..  if( p ){.
26cb0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
26cc0 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
26cd0 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
26ce0 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
26cf0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
26d00 68 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72 65 74  hOut>=0 );.  ret
26d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26d20 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
26d30 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
26d40 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
26d50 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
26d60 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
26d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
26d80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
26d90 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
26da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26db0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
26dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e00 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
26e10 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
26e20 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
26e30 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
26e40 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
26e50 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
26e60 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
26e70 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
26e80 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
26e90 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
26ea0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
26eb0 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
26ec0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
26ed0 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
26ee0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
26ef0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
26f00 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
26f10 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
26f20 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
26f30 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
26f40 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
26f50 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
26f60 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
26f70 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
26f80 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
26f90 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
26fa0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
26fb0 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
26fc0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
26fd0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
26fe0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
26ff0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
27000 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
27010 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
27020 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
27030 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
27040 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
27050 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
27060 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
27070 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
27080 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
27090 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
270a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
270b0 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
270c0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
270d0 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
270e0 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
270f0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
27100 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
27110 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
27120 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
27130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
27140 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
27150 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
27160 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
27170 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
27180 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
27190 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
271a0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
271b0 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
271c0 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
271d0 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
271e0 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
271f0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
27200 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
27210 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
27220 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
27230 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
27240 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
27250 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
27260 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
27270 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
27280 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
27290 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
272a0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
272b0 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
272c0 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
272d0 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
272e0 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
272f0 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
27300 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
27310 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
27320 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
27330 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
27340 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
27350 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
27360 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
27370 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
27380 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
27390 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
273a0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
273b0 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
273c0 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
273d0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
273e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
273f0 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27440 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
274c0 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27510 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27530 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27560 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27580 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
275b0 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275d0 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
27600 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
27610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27620 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
27650 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
27660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
27670 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
276a0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
276b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
276c0 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
276f0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
27700 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
27710 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
27720 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27730 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
27740 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
27750 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
27760 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
27790 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
277a0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
277b0 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
277e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
277f0 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
27800 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27820 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
27830 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
27840 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
27850 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27870 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
27880 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
27890 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
278a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
278d0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
278e0 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
278f0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27910 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
27920 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
27930 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
27940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20  \.   unixFetch, 
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20   /* xFetch */   
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
279b0 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c  .   unixUnfetch,
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20  /* xUnfetch */  
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27a00 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
27a50 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
27a60 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
27a70 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
27a80 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
27a90 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
27aa0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27ab0 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
27ac0 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
27ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ae0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
27af0 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
27b90 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
27ba0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
27bb0 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
27bc0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
27bd0 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
27be0 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
27bf0 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
27c00 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
27c10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27c20 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
27c30 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
27c40 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
27c50 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
27c60 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
27c70 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
27c80 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
27c90 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
27ca0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
27cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
27cc0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
27cd0 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
27ce0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
27cf0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
27d00 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
27d10 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
27d40 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65  ory and mmap are
27d50 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
27d60 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
27d70 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
27d80 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
27d90 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
27da0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
27db0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
27dc0 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
27dd0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
27de0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
27df0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
27e00 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
27e10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
27e20 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
27e30 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
27e40 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
27e50 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
27e60 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
27e70 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
27e80 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
27e90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
27ea0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
27eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
27ed0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
27ee0 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
27ef0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
27f00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
27f10 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
27f20 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
27f30 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
27f40 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
27f50 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
27f60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
27f70 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
27f80 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
27f90 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
27fa0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
27fb0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
27fc0 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
27fd0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
27fe0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
27ff0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
28000 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
28010 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
28020 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28030 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28050 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
28060 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
28070 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
28080 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
28090 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
280a0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
280b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
280c0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
280d0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
280e0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
280f0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
28100 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
28110 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28120 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
28130 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
28140 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
28150 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28160 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
28170 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
28180 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
28190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
281a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
281b0 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
281c0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
281d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
281e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
281f0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28220 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
28230 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28250 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28260 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28280 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
28290 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282b0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
282c0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
282d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
282e0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
282f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28300 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
28310 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
28320 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
28330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28340 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28350 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
28360 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28370 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28380 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28390 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
283c0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
283d0 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
283e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
283f0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28400 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
28410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28420 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28430 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
28440 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28450 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28460 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
28470 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
28480 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28490 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
284a0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
284b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
284c0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
284d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
284e0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
284f0 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
28500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
28510 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
28520 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
28530 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
28540 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
28550 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
28560 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
28590 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
285a0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285c0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
285d0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285f0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
28600 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28620 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28630 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
28640 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
28650 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
28660 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
28670 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
28680 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
28690 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
286a0 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
286b0 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
286c0 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
286d0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
286e0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
286f0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
28700 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
28710 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
28720 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
28730 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
28740 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
28750 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
28760 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
28770 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
28780 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
28790 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
287a0 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
287b0 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
287c0 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
287d0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
287e0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
287f0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
28800 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
28810 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
28820 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
28830 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
28840 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
28850 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
28860 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
28870 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
28880 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28890 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
288a0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
288b0 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
288c0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
288d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
288e0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
288f0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
28900 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
28910 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
28920 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
28930 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
28940 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
28950 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
28960 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28970 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28980 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
28990 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
289a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
289b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
289c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
289d0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
289e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
289f0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
28a00 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
28a10 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
28a20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28a30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
28a40 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
28a50 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28a60 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
28a70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
28a80 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28a90 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
28aa0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
28ab0 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
28ac0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28ad0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
28ae0 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
28af0 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
28b00 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
28b10 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
28b20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
28b30 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
28b40 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
28b50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28b60 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
28b70 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b90 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28ba0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
28bb0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
28bc0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
28bd0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28be0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28c10 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
28c20 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
28c30 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
28c40 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
28c50 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
28c60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28c70 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
28c80 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
28c90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28ca0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28cb0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
28cc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28cd0 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
28ce0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28cf0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
28d00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
28d10 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
28d20 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28d30 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
28d40 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
28d50 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
28d60 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
28d70 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
28d80 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
28d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
28da0 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
28db0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
28dc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28dd0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
28de0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
28df0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
28e00 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
28e10 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
28e20 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
28e30 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
28e40 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
28e50 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
28e60 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
28e70 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
28e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28e90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
28ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
28eb0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
28ec0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
28ed0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
28ee0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
28ef0 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
28f00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
28f10 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
28f20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
28f30 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
28f40 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
28f50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
28f60 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
28f70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
28f80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
28f90 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
28fa0 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
28fb0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
28fc0 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
28fd0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
28fe0 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
28ff0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
29000 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
29010 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
29020 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
29030 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
29040 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
29050 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
29060 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
29070 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
29080 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
29090 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
290a0 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
290b0 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
290c0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
290d0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
290e0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
290f0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
29100 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
29110 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
29120 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
29130 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
29140 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
29150 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
29160 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
29170 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
29180 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
29190 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
291a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
291b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
291c0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
291d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
291e0 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
291f0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
29200 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
29210 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
29220 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
29230 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
29240 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
29250 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
29260 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
29270 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
29280 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
29290 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
292a0 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
292b0 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
292c0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
292d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
292e0 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
292f0 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
29300 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
29310 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
29320 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
29330 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
29340 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
29350 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
29360 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
29370 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
29380 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
29390 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
293a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
293b0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
293c0 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
293d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
293e0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
293f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
29400 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
29410 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
29420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29430 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
29440 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
29450 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29460 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
29470 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
29480 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
29490 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
294a0 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
294b0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
294c0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
294d0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
294e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
294f0 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
29500 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
29510 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29520 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
29530 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
29540 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
29550 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
29560 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
29570 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
29580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29590 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
295a0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
295b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
295c0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
295d0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
295e0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
295f0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
29600 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
29610 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
29620 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29630 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
29640 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
29650 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
29660 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
29670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29680 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
29690 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
296a0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
296b0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
296c0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
296d0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
296e0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
296f0 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
29700 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
29710 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
29720 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
29730 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
29740 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
29750 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
29760 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
29770 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
29780 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
29790 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
297a0 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
297b0 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
297c0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
297d0 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
297e0 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
297f0 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
29800 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
29810 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
29820 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
29830 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
29840 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
29850 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
29860 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
29870 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
29880 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
29890 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
298a0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
298b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
298c0 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
298d0 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
298e0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
298f0 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
29900 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
29910 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
29920 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
29930 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
29940 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
29950 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
29960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29970 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
29980 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
29990 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
299a0 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
299b0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
299c0 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
299d0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
299e0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
299f0 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
29a00 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
29a10 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
29a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
29a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
29a80 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
29a90 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
29aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
29ab0 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
29ac0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
29ad0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29ae0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
29af0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
29b00 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
29b10 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
29b20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
29b30 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
29b40 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
29b50 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
29b60 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
29b70 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
29b80 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
29b90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
29ba0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
29bb0 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
29bc0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
29bd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
29be0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
29bf0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
29c00 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
29c10 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
29c20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
29c30 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
29c40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
29c50 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
29c60 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
29c70 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  pened */.  int c
29c80 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
29c90 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
29ca0 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61  re UNIXFILE_* va
29cb0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  lues */.){.  con
29cc0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
29cd0 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
29ce0 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
29cf0 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
29d00 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
29d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29d20 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
29d30 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
29d40 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
29d50 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
29d60 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
29d70 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
29d80 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
29d90 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
29da0 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
29db0 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
29dc0 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
29dd0 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
29de0 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
29df0 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
29e00 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
29e10 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29e20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29e30 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
29e40 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
29e50 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
29e60 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
29e70 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
29e80 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
29e90 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
29ea0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
29eb0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
29ec0 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
29ed0 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63  dif..  /* No loc
29ee0 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
29ef0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
29f00 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
29f10 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
29f20 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
29f30 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
29f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
29f50 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
29f60 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
29f70 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
29f80 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
29f90 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
29fa0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
29fb0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
29fc0 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
29fd0 73 3b 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 4c  s;.  pNew->mmapL
29fe0 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
29ff0 46 41 55 4c 54 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FAULT_MMAP_LIMIT
2a000 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
2a010 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74  uri_boolean(((ct
2a020 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2a030 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e  LE_URI) ? zFilen
2a040 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20  ame : 0),.      
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a060 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c       "psow", SQL
2a070 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
2a080 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
2a090 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2a0a0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  |= UNIXFILE_PSOW
2a0b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
2a0c0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
2a0d0 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29  unix-excl")==0 )
2a0e0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2a0f0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2a100 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
2a110 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
2a120 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
2a130 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
2a140 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
2a150 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
2a160 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2a170 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
2a180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a190 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
2a1a0 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
2a1b0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2a1c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
2a1d0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
2a1e0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2a1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
2a200 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
2a210 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
2a220 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
2a230 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
2a240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2a250 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2a260 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
2a270 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
2a280 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
2a290 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
2a2a0 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
2a2b0 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
2a2c0 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
2a2d0 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
2a2e0 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
2a2f0 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
2a300 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
2a310 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
2a320 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
2a330 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
2a340 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2a350 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
2a360 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
2a370 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
2a380 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
2a390 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
2a3a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2a3b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a3c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2a3d0 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
2a3e0 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
2a3f0 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
2a400 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2a410 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2a420 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2a430 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2a440 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2a450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a460 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
2a470 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69  r occurred in fi
2a480 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
2a490 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
2a4a0 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
2a4b0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
2a4c0 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
2a4d0 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
2a4e0 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
2a4f0 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
2a500 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
2a510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2a520 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
2a530 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
2a540 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
2a550 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
2a560 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2a570 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
2a580 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
2a590 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
2a5a0 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
2a5b0 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
2a5c0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
2a5d0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
2a5e0 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
2a5f0 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
2a600 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
2a610 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
2a620 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
2a630 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
2a640 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
2a650 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
2a660 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
2a670 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
2a680 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
2a690 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
2a6a0 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
2a6b0 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
2a6c0 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
2a6d0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
2a6e0 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
2a6f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2a700 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
2a710 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
2a720 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
2a730 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
2a740 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
2a750 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
2a760 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
2a770 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
2a780 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
2a790 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
2a7a0 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
2a7b0 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
2a7c0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
2a7d0 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
2a7e0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
2a7f0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2a800 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
2a810 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
2a820 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2a830 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
2a840 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a850 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2a860 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
2a870 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2a880 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
2a890 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
2a8a0 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
2a8b0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2a8c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2a8d0 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2a8e0 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
2a8f0 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
2a900 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
2a910 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
2a920 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
2a930 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
2a940 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
2a950 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
2a960 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
2a970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2a980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2a990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2a9a0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
2a9b0 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
2a9c0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
2a9d0 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
2a9e0 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
2a9f0 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
2aa00 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
2aa10 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
2aa20 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
2aa30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
2aa40 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
2aa50 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
2aa60 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2aa70 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
2aa80 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
2aa90 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
2aaa0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2aab0 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
2aac0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2aad0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2aae0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2aaf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ab00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ab10 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2ab20 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
2ab30 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2ab40 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2ab50 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
2ab60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
2ab70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
2ab80 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
2ab90 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
2aba0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2abb0 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
2abc0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2abd0 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
2abe0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2abf0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2ac00 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2ac10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
2ac20 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
2ac30 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
2ac40 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
2ac50 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
2ac60 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
2ac70 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
2ac80 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
2ac90 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
2aca0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
2acb0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
2acc0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2acd0 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
2ace0 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
2acf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2ad00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2ad10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ad20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2ad30 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
2ad40 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
2ad50 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
2ad60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
2ad70 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
2ad80 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
2ad90 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
2ada0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
2adb0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2adc0 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
2add0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
2ade0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
2adf0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2ae00 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2ae10 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
2ae20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
2ae30 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
2ae40 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
2ae50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2ae60 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2ae70 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2ae80 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2ae90 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
2aea0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
2aeb0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
2aec0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
2aed0 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
2aee0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2aef0 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
2af00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2af10 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
2af20 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
2af30 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
2af60 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
2af70 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
2af80 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
2af90 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
2afa0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
2afb0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
2afc0 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
2afd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
2afe0 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
2aff0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
2b000 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
2b010 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2b020 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
2b030 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2b040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2b050 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
2b060 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
2b070 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
2b080 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2b090 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2b0a0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
2b0b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
2b0c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2b0d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b0e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2b0f0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2b100 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2b110 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
2b120 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
2b130 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2b140 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
2b150 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
2b160 29 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67  ) pNew->ctrlFlag
2b170 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2b180 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69  LETE;.#endif.  i
2b190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b1a0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2b1b0 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2b1c0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2b1d0 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
2b1e0 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
2b1f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
2b200 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
2b210 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
2b220 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2b230 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
2b240 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
2b250 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
2b260 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
2b270 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
2b280 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2b290 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
2b2a0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
2b2b0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
2b2c0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
2b2d0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
2b2e0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2b2f0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
2b300 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
2b310 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
2b320 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
2b330 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
2b340 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
2b350 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
2b360 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
2b370 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
2b380 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2b390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b3a0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
2b3b0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
2b3c0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
2b3d0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
2b3e0 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
2b3f0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
2b400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2b410 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
2b420 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
2b430 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
2b440 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
2b450 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2b460 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
2b470 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
2b480 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
2b490 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
2b4a0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
2b4b0 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
2b4c0 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
2b4d0 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
2b4e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
2b4f0 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
2b500 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2b510 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
2b520 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
2b530 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
2b540 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
2b550 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
2b560 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
2b570 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
2b580 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2b590 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
2b5a0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
2b5b0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
2b5c0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2b5d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
2b5e0 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
2b5f0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
2b600 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2b610 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
2b620 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
2b630 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
2b640 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
2b650 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
2b660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2b670 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
2b680 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2b690 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2b6a0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2b6b0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2b6c0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2b6d0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2b6e0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2b6f0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2b700 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2b710 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
2b720 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2b730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2b740 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
2b750 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2b760 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
2b770 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
2b780 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2b790 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2b7a0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
2b7b0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
2b7c0 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
2b7d0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
2b7e0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
2b7f0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
2b800 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
2b810 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
2b820 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2b830 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69  IX) + 18) >= (si
2b840 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
2b850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b860 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
2b870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2b880 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
2b890 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
2b8a0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2b8b0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
2b8c0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
2b8d0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
2b8e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
2b8f0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
2b900 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
2b910 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
2b920 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
2b930 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
2b940 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
2b950 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
2b960 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
2b970 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
2b980 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
2b990 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
2b9a0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
2b9b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b9c0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
2b9d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b9e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2b9f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
2ba00 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
2ba10 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
2ba20 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
2ba30 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
2ba40 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
2ba50 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
2ba60 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
2ba70 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
2ba80 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
2ba90 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2baa0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
2bab0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2bac0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
2bad0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
2bae0 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
2baf0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
2bb00 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
2bb10 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2bb20 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
2bb30 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
2bb40 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
2bb50 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
2bb60 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
2bb70 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
2bb80 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
2bb90 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
2bba0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
2bbb0 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
2bbc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2bbd0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
2bbe0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2bbf0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
2bc00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2bc10 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
2bc20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2bc30 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
2bc40 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
2bc50 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
2bc60 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
2bc70 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
2bc80 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
2bc90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2bca0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2bcb0 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
2bcc0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
2bcd0 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
2bce0 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
2bcf0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
2bd00 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
2bd10 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
2bd20 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
2bd30 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
2bd40 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
2bd50 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
2bd60 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
2bd70 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
2bd80 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
2bd90 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
2bda0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
2bdb0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
2bdc0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
2bdd0 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
2bde0 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
2bdf0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2be00 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
2be10 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
2be20 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
2be30 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
2be40 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
2be50 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2be60 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
2be70 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
2be80 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2be90 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
2bea0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
2beb0 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
2bec0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
2bed0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
2bee0 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
2bef0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
2bf00 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
2bf10 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
2bf20 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
2bf30 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
2bf40 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
2bf50 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
2bf60 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
2bf70 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
2bf80 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
2bf90 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
2bfa0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
2bfb0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2bfc0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2bfd0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
2bfe0 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
2bff0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
2c000 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
2c010 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
2c020 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
2c030 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
2c040 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
2c050 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
2c060 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
2c070 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
2c080 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
2c090 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
2c0a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
2c0b0 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
2c0c0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
2c0d0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
2c0e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2c0f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
2c100 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
2c110 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
2c120 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
2c130 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
2c140 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2c150 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
2c160 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
2c170 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
2c180 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
2c190 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
2c1a0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
2c1b0 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
2c1c0 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
2c1d0 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
2c1e0 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
2c1f0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2c200 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
2c210 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
2c220 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
2c230 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c240 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
2c250 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
2c260 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
2c270 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
2c280 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
2c290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c2a0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
2c2b0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
2c2c0 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
2c2d0 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
2c2e0 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
2c2f0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
2c300 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
2c310 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
2c320 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
2c330 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
2c340 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
2c350 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
2c360 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
2c370 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
2c380 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
2c390 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
2c3a0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
2c3b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2c3c0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2c3d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2c3e0 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
2c3f0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
2c400 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
2c410 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2c420 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2c430 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
2c440 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
2c450 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
2c460 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
2c470 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
2c480 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2c490 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
2c4a0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
2c4b0 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
2c4c0 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
2c4d0 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
2c4e0 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
2c4f0 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
2c500 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
2c510 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
2c520 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2c530 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
2c540 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2c550 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
2c560 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
2c570 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73  *.** In most cas
2c580 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  es cases, this r
2c590 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
2c5a0 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
2c5b0 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
2c5c0 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
2c5d0 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
2c5e0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
2c5f0 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
2c600 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2c610 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
2c620 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
2c630 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
2c640 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2c650 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2c660 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2c670 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2c680 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2c690 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2c6a0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2c6b0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2c6c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2c6d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2c6e0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2c6f0 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2c700 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2c710 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2c720 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2c730 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2c740 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2c750 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2c760 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2c770 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2c780 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2c790 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2c7a0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2c7b0 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2c7c0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2c7d0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2c7e0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2c7f0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2c800 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2c810 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2c820 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2c830 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2c840 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2c850 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2c860 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2c870 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2c880 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c8a0 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2c8b0 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2c8c0 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2c8d0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c8f0 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2c900 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2c910 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2c920 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2c930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c940 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2c950 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2c960 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2c970 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2c980 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2c990 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2c9a0 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2c9b0 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2c9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2c9d0 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2c9e0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2c9f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ca00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ca10 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2ca20 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
2ca30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
2ca40 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
2ca50 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2ca60 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2ca70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2ca80 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
2ca90 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
2caa0 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
2cab0 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
2cac0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cae0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2caf0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
2cb00 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
2cb10 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2cb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2cb30 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
2cb40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2cb50 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
2cb60 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
2cb70 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
2cb80 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
2cb90 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
2cba0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
2cbb0 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
2cbc0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
2cbd0 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
2cbe0 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
2cbf0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
2cc00 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
2cc10 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
2cc20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2cc30 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
2cc40 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2cc50 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
2cc60 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2cc70 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
2cc80 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2cc90 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
2cca0 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
2ccb0 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
2ccc0 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
2ccd0 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
2cce0 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
2ccf0 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
2cd00 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
2cd10 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
2cd20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2cd30 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
2cd40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2cd50 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
2cd60 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
2cd70 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
2cd80 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
2cd90 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
2cda0 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
2cdb0 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
2cdc0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
2cdd0 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
2cde0 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
2cdf0 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
2ce00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ce10 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
2ce20 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
2ce30 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
2ce40 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
2ce50 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
2ce60 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
2ce70 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
2ce80 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
2ce90 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
2cea0 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
2ceb0 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20  e & 0777;.      
2cec0 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2ced0 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69  _uid;.      *pGi
2cee0 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
2cef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cf00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2cf10 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
2cf20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
2cf30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2cf40 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
2cf50 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2cf60 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0600;.  }.  retu
2cf70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cf80 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
2cf90 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
2cfa0 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
2cfb0 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
2cfc0 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2cfd0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
2cfe0 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
2cff0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2d000 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
2d010 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2d020 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
2d030 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2d040 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
2d050 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
2d060 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
2d070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
2d080 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
2d090 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
2d0a0 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
2d0b0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2d0c0 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
2d0d0 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
2d0e0 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
2d0f0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
2d100 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
2d110 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
2d120 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
2d130 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
2d140 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
2d150 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
2d160 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
2d170 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
2d180 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
2d190 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
2d1a0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
2d1b0 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
2d1c0 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
2d1d0 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
2d1e0 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
2d1f0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
2d200 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
2d210 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
2d220 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
2d230 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
2d240 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
2d250 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
2d260 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
2d270 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d290 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
2d2a0 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
2d2b0 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
2d2c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2d2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d2e0 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
2d2f0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
2d300 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2d310 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
2d320 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
2d330 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
2d340 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
2d350 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2d360 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
2d370 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
2d380 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
2d390 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d3b0 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
2d3c0 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
2d3d0 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
2d3e0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
2d3f0 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
2d400 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2d430 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
2d440 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2d450 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
2d460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2d470 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
2d480 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
2d490 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2d4a0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
2d4b0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2d4c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
2d4d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2d4e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2d4f0 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
2d500 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
2d510 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d520 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d530 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
2d540 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74  Code */.  int ct
2d550 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  rlFlags = 0;    
2d560 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58           /* UNIX
2d570 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
2d580 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
2d590 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
2d5a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2d5b0 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
2d5c0 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
2d5d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2d5e0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
2d5f0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
2d600 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
2d610 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2d620 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
2d630 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
2d640 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2d650 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
2d660 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
2d670 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d680 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
2d690 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2d6a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2d6b0 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
2d6c0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2d6d0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2d6e0 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
2d6f0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2d700 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2d710 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d720 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
2d730 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
2d740 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
2d750 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
2d760 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
2d770 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2d780 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
2d790 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
2d7a0 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
2d7b0 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
2d7c0 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
2d7d0 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
2d7e0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
2d7f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
2d800 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
2d810 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
2d820 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
2d830 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
2d840 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
2d850 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2d860 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2d870 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2d880 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d890 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2d8a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2d8b0 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
2d8c0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
2d8d0 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
2d8e0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
2d8f0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
2d900 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
2d910 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
2d920 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
2d930 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
2d940 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
2d950 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
2d960 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
2d970 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2d980 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
2d990 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
2d9a0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
2d9b0 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
2d9c0 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
2d9d0 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
2d9e0 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
2d9f0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
2da00 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
2da10 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
2da20 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
2da30 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
2da40 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
2da50 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
2da60 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
2da70 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2da80 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2da90 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
2daa0 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
2dab0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2dac0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2dad0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
2dae0 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
2daf0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
2db00 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
2db10 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
2db20 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
2db30 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
2db40 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
2db50 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
2db60 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
2db70 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
2db80 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2db90 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
2dba0 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
2dbb0 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
2dbc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
2dbd0 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
2dbe0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2dbf0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
2dc00 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
2dc10 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
2dc20 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2dc30 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2dc40 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2dc50 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
2dc60 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2dc70 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2dc80 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2dc90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2dca0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2dcb0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2dcc0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2dcd0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2dce0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2dcf0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2dd00 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2dd10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2dd20 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
2dd30 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
2dd40 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
2dd50 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
2dd60 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
2dd70 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2dd80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2dd90 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
2dda0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2ddb0 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
2ddc0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2ddd0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2dde0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2ddf0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2de00 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2de10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2de20 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
2de30 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2de40 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2de50 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2de60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2de70 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
2de80 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2de90 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
2dea0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2deb0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2dec0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
2ded0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2dee0 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
2def0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2df00 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
2df10 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
2df20 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
2df30 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2df40 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
2df50 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
2df60 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
2df70 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2df80 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
2df90 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
2dfa0 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2dfb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dfc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2dfd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
2dfe0 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2dff0 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ..    /* Databas
2e000 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
2e010 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2e020 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
2e030 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52  re not.    ** UR
2e040 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
2e050 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
2e060 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
2e070 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a  assed into.    *
2e080 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
2e090 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
2e0a0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
2e0b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2e0c0 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72  RI) || zName[str
2e0d0 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
2e0e0 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28   );..  }else if(
2e0f0 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
2e100 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
2e110 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
2e120 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
2e130 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
2e140 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
2e150 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69  elete && !syncDi
2e160 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  r);.    rc = uni
2e170 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
2e180 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d  _PATHNAME+2, zTm
2e190 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
2e1a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e1b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
2e1d0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
2e1e0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
2e1f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
2e200 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
2e210 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2e220 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
2e230 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
2e240 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2e250 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2e260 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2e270 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
2e280 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
2e290 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2e2a0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2e2b0 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
2e2c0 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
2e2d0 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
2e2e0 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
2e2f0 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
2e300 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
2e310 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
2e320 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
2e330 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
2e340 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
2e350 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
2e360 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
2e370 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
2e380 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
2e390 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
2e3a0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2e3b0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
2e3c0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
2e3d0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
2e3e0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
2e3f0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
2e400 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
2e410 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
2e420 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
2e430 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
2e440 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
2e450 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
2e460 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
2e470 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
2e480 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
2e490 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
2e4a0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
2e4b0 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69  e with */.    ui
2e4c0 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20  d_t uid;        
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2e4e0 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69  serid for the fi
2e4f0 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20  le */.    gid_t 
2e500 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
2e510 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70          /* Group
2e520 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2e530 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
2e540 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
2e550 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
2e560 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
2e570 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
2e580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e590 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
2e5a0 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
2e5b0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2e5c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2e5d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2e5e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2e5f0 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
2e600 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2e610 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2e620 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2e630 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2e640 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
2e650 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
2e660 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
2e670 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
2e680 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
2e690 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
2e6a0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
2e6b0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
2e6c0 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
2e6d0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
2e6e0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2e6f0 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
2e700 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
2e710 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
2e720 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2e730 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2e740 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
2e750 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
2e760 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
2e770 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2e780 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2e790 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2e7a0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
2e7b0 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
2e7c0 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
2e7d0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2e7e0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2e7f0 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
2e800 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
2e810 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2e820 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2e830 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
2e840 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
2e850 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2e860 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
2e870 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
2e880 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
2e890 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74  oot and if creat
2e8a0 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61  ing a new rollba
2e8b0 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
2e8c0 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73  l or WAL file, s
2e8d0 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70  et the ownership
2e8e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2e8f0 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20  or WAL to be.   
2e900 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20   ** the same as 
2e910 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
2e920 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
2e930 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2e940 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2e950 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2e960 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2e970 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75    osFchown(fd, u
2e980 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
2e990 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
2e9a0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
2e9b0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
2e9c0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
2e9d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
2e9e0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
2e9f0 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
2ea00 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
2ea10 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
2ea20 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
2ea30 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
2ea40 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
2ea50 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
2ea60 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
2ea70 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
2ea80 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
2ea90 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2eaa0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
2eab0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2eac0 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
2ead0 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
2eae0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2eaf0 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
2eb00 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2eb10 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2eb20 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2eb30 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
2eb40 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
2eb50 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
2eb60 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2eb70 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2eb80 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  no;.    robust_c
2eb90 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2eba0 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2ebb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2ebc0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2ebd0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2ebe0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2ebf0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2ec00 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2ec10 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2ec20 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2ec30 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2ec40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
2ec50 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
2ec60 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
2ec70 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2ec90 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2eca0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
2ecb0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2ecd0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2ece0 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  LE_RDONLY;.  if(
2ecf0 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
2ed00 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2ed10 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2ed20 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
2ed30 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
2ed40 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2ed50 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2ed60 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
2ed70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2ed80 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
2ed90 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
2eda0 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
2edb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2edc0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
2edd0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2ede0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
2edf0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
2ee00 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
2ee10 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
2ee20 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
2ee30 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
2ee40 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
2ee50 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
2ee60 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2ee70 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
2ee80 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
2ee90 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
2eea0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2eeb0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
2eec0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
2eed0 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
2eee0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
2eef0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
2ef00 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
2ef10 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
2ef20 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
2ef30 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
2ef40 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
2ef50 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
2ef60 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
2ef70 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
2ef80 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
2ef90 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
2efa0 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
2efb0 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
2efc0 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
2efd0 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
2efe0 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
2eff0 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
2f000 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2f010 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
2f020 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
2f030 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
2f040 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
2f050 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
2f060 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
2f070 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
2f080 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2f090 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
2f0a0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
2f0b0 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
2f0c0 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
2f0d0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
2f0e0 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
2f0f0 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
2f100 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
2f110 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
2f120 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
2f130 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
2f140 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
2f150 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
2f160 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
2f170 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
2f180 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
2f190 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2f1a0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2f1b0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2f1c0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2f1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2f1e0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
2f1f0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2f200 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
2f210 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
2f220 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
2f230 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
2f240 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
2f250 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
2f260 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
2f270 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
2f280 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
2f290 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
2f2a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f2b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
2f2c0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
2f2d0 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
2f2e0 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
2f2f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2f300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f310 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
2f320 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
2f330 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
2f340 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
2f350 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
2f360 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
2f370 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
2f380 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
2f390 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
2f3a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
2f3b0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
2f3c0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
2f3d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
2f3e0 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
2f3f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2f400 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
2f410 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
2f420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f440 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2f450 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
2f460 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2f470 70 2d 3e 73 7a 53 79 73 70 61 67 65 20 3d 20 75  p->szSyspage = u
2f480 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 29  nixGetPagesize()
2f490 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55  ;.  rc = fillInU
2f4a0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
2f4b0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
2f4c0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
2f4d0 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
2f4e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f4f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2f500 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
2f510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f520 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
2f530 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
2f540 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
2f550 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
2f560 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
2f570 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
2f580 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
2f590 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
2f5a0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
2f5b0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2f5c0 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
2f5d0 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
2f5e0 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
2f5f0 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
2f600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2f610 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
2f620 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2f630 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
2f640 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
2f650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2f660 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
2f670 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
2f680 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
2f690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f6a0 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
2f6b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2f6c0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2f6d0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
2f6e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
2f6f0 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b  ;.  if( osUnlink
2f700 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b  (zPath)==(-1) ){
2f710 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d  .    if( errno==
2f720 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
2f730 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2f740 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a  R_DELETE_NOENT;.
2f750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f760 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2f770 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2f780 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22  DELETE, "unlink"
2f790 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
2f7a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f7b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
2f7c0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
2f7d0 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63  C.  if( (dirSync
2f7e0 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20   & 1)!=0 ){.    
2f7f0 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
2f800 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
2f810 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
2f820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f830 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
2f840 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
2f850 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
2f860 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
2f870 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
2f880 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2f890 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2f8a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2f8b0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
2f8c0 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
2f8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
2f8e0 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2f8f0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2f900 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f910 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2f920 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f930 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2f940 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2f950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
2f960 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  t the existence 
2f970 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
2f980 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
2f990 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
2f9a0 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
2f9b0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
2f9c0 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
2f9d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
2f9e0 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
2f9f0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2fa00 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
2fa10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2fa20 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
2fa30 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
2fa40 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
2fa50 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
2fa60 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
2fa70 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
2fa80 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
2fa90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
2faa0 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
2fab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2fac0 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
2fad0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2fae0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
2faf0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
2fb00 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
2fb10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2fb20 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
2fb30 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
2fb40 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
2fb50 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2fb60 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
2fb70 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
2fb80 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
2fb90 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
2fba0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
2fbb0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
2fbc0 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
2fbd0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2fbe0 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
2fbf0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2fc00 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
2fc10 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2fc20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
2fc30 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
2fc40 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
2fc50 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2fc60 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
2fc70 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
2fc80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2fc90 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2fca0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
2fcb0 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
2fcc0 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2fcd0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2fce0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
2fcf0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
2fd00 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2fd10 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
2fd20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
2fd30 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
2fd40 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
2fd50 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65  ResOut = (osAcce
2fd60 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
2fd70 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ==0);.  if( flag
2fd80 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
2fd90 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73  _EXISTS && *pRes
2fda0 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Out ){.    struc
2fdb0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2fdc0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2fdd0 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
2fde0 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
2fdf0 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
2fe00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2fe10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fe20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
2fe30 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2fe40 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
2fe50 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
2fe60 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
2fe70 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
2fe80 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
2fe90 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
2fea0 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
2feb0 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
2fec0 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
2fed0 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
2fee0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
2fef0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
2ff00 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
2ff10 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
2ff20 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
2ff30 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
2ff40 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
2ff50 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
2ff60 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
2ff70 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
2ff80 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2ff90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2ffa0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2ffb0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2ffc0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ffd0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2ffe0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2fff0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
30000 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
30010 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
30020 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
30030 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
30040 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
30050 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
30060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30070 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
30080 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
30090 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
300a0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
300b0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
300c0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
300d0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
300e0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
300f0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
30100 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
30110 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
30120 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
30130 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
30140 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
30150 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
30160 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
30170 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
30180 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
30190 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
301a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
301b0 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
301c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
301d0 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
301e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
301f0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
30200 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
30210 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
30220 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
30230 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30240 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
30250 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
30260 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
30270 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
30280 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
30290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
302a0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
302b0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
302c0 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
302d0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
302e0 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
302f0 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
30300 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30310 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
30320 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
30330 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
30340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30350 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
30360 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
30370 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
30380 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
30390 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
303a0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
303b0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
303c0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
303d0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
303e0 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
303f0 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
30400 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
30410 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
30420 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
30430 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
30440 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
30450 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
30460 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
30470 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
30480 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
30490 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
304a0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
304b0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
304c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
304d0 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
304e0 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
304f0 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
30500 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
30510 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
30520 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
30530 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
30540 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
30550 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
30560 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
30570 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
30580 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
30590 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
305a0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
305b0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
305c0 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
305d0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
305e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
305f0 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
30600 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
30610 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
30620 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
30630 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
30640 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30650 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
30660 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
30670 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
30680 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
30690 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
306a0 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
306b0 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
306c0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
306d0 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
306e0 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
306f0 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
30700 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
30710 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
30720 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
30730 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
30740 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
30750 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
30760 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
30770 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
30780 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
30790 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
307a0 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
307b0 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
307c0 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
307d0 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
307e0 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
307f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
30800 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
30810 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
30820 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
30830 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
30840 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
30850 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
30860 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
30870 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
30880 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
30890 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
308a0 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
308b0 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
308c0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
308d0 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
308e0 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
308f0 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
30900 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
30910 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
30920 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
30930 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
30940 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
30950 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
30960 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
30970 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
30980 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
30990 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
309a0 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
309b0 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
309c0 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
309d0 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
309e0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
309f0 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
30a00 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
30a10 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
30a20 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
30a30 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
30a40 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
30a50 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
30a60 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
30a70 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
30a80 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
30a90 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
30aa0 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
30ab0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30ac0 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
30ad0 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
30ae0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
30af0 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
30b00 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
30b10 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
30b20 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
30b30 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
30b40 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
30b50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30b60 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
30b70 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
30b80 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
30b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
30ba0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
30bb0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
30bc0 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
30bd0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
30be0 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
30bf0 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
30c00 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
30c10 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
30c20 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
30c30 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
30c40 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
30c50 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
30c60 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
30c70 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
30c80 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
30c90 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
30ca0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
30cb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30cc0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
30cd0 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
30ce0 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
30cf0 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
30d00 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
30d10 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
30d20 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
30d30 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
30d40 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
30d50 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
30d60 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
30d70 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
30d80 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
30d90 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
30da0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
30db0 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
30dc0 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
30dd0 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
30de0 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
30df0 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
30e00 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
30e10 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
30e20 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
30e30 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
30e40 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
30e50 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
30e60 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
30e70 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
30e80 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
30e90 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
30ea0 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
30eb0 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
30ec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
30ed0 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
30ee0 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
30ef0 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
30f00 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
30f10 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
30f20 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
30f30 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
30f40 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
30f50 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
30f60 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
30f70 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
30f80 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
30f90 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
30fa0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
30fb0 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74  int pid, fd, got
30fc0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
30fd0 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  t_open("/dev/ura
30fe0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ndom", O_RDONLY,
30ff0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c   0);.    if( fd<
31000 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
31010 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
31020 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
31030 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
31040 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
31050 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
31060 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
31070 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
31080 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
31090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
310a0 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
310b0 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
310c0 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
310d0 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
310e0 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
310f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
31100 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
31110 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
31120 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
31130 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
31140 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
31150 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
31160 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
31170 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
31180 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
31190 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
311a0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
311b0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
311c0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
311d0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
311e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
311f0 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
31200 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
31210 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
31220 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31230 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
31240 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
31250 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
31260 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
31270 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
31280 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
31290 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
312a0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
312b0 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
312c0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
312d0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
312e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
312f0 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
31300 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31310 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
31320 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
31330 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
31340 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
31350 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
31360 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
31370 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
31380 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
31390 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
313a0 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
313b0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
313c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
313d0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
313e0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
313f0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
31400 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
31410 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
31420 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
31430 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31440 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31450 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
31460 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
31470 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
31480 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
31490 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
314a0 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
314b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
314c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
314d0 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
314e0 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
314f0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
31500 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
31510 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
31520 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
31530 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
31540 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
31550 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
31560 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
31570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
31580 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
31590 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
315a0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
315b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
315c0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
315d0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
315e0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
315f0 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
31600 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
31610 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
31620 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
31630 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
31640 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
31650 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
31660 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
31670 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
31680 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
31690 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
316a0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
316b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
316c0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
316d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
316e0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
316f0 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
31700 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
31710 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
31720 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
31730 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
31740 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
31750 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
31760 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
31770 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
31780 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
31790 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
317a0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
317b0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
317c0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
317d0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
317e0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
317f0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31800 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
31810 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
31820 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
31830 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
31840 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
31850 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
31860 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
31870 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
31880 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
31890 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
318a0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
318b0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
318c0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
318d0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
318e0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
318f0 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
31900 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
31910 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
31920 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
31930 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
31940 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
31950 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
31960 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
31970 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
31980 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
31990 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d  ow;.  if( gettim
319a0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
319b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ==0 ){.    *piNo
319c0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
319d0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
319e0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
319f0 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31  + sNow.tv_usec/1
31a00 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
31a10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
31a20 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ROR;.  }.#endif.
31a30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
31a40 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
31a50 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
31a60 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
31a70 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
31a80 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
31a90 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
31aa0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
31ab0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31ac0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
31ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31ae0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
31af0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
31b00 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
31b10 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
31b20 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
31b30 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
31b40 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
31b50 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
31b60 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
31b70 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
31b80 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
31b90 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
31ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31bb0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
31bc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31bd0 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
31be0 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
31bf0 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
31c00 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
31c10 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31c20 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
31c30 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
31c40 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
31c50 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
31c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31c70 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
31c80 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
31c90 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
31ca0 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
31cb0 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
31cc0 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
31cd0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
31ce0 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
31cf0 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
31d00 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
31d10 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
31d20 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
31d30 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
31d40 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
31d50 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
31d60 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
31d70 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
31d80 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
31d90 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
31da0 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
31db0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
31dc0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
31dd0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31de0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
31df0 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
31e00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31e10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
31e20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31e30 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
31e40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31e50 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
31e60 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
31e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31e80 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
31e90 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
31ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
31ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
31f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
31f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f70 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
31f80 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
31f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
31fb0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
31fc0 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
31fd0 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
31fe0 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
31ff0 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
32000 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
32010 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
32020 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
32030 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
32040 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
32050 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
32060 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
32070 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
32080 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
32090 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
320a0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
320b0 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
320c0 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
320d0 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
320e0 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
320f0 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
32100 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
32110 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
32120 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
32130 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
32140 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
32150 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
32160 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
32170 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
32180 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
32190 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
321a0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
321b0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
321c0 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
321d0 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
321e0 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
321f0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
32200 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
32210 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
32220 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
32230 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
32240 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
32250 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
32260 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
32270 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
32280 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
32290 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
322a0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
322b0 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
322c0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
322d0 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
322e0 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
322f0 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
32300 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
32310 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
32320 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
32330 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
32340 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
32350 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
32360 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
32370 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
32380 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
32390 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
323a0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
323b0 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
323c0 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
323d0 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
323e0 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
323f0 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
32400 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
32410 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
32420 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
32430 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
32440 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
32450 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
32460 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
32470 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
32480 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
32490 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  0000000.**      
324a0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
324b0 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
324c0 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
324d0 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
324e0 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
324f0 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
32500 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
32510 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
32520 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
32530 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
32540 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
32550 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
32560 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
32570 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
32580 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
32590 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
325a0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
325b0 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
325c0 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
325d0 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
325e0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
325f0 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
32600 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
32610 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
32620 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
32630 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
32640 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
32650 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
32660 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
32670 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
32680 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
32690 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
326a0 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
326b0 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
326c0 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
326d0 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
326e0 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
326f0 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
32700 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
32710 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
32720 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
32730 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
32740 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
32750 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
32760 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
32770 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
32780 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
32790 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
327a0 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
327b0 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
327c0 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
327d0 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
327e0 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
327f0 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
32800 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
32810 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
32820 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
32830 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
32840 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
32850 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
32860 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
32870 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
32880 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
32890 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
328a0 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
328b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
328c0 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
328d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
328e0 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
328f0 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
32900 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32920 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
32930 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
32940 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
32950 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
32960 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
32970 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
32980 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
32990 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
329a0 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
329b0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
329c0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
329d0 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
329e0 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
329f0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
32a00 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
32a10 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
32a20 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
32a30 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
32a40 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
32a50 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
32a60 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
32a70 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
32a80 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
32a90 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
32aa0 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
32ab0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
32ac0 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
32ad0 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
32ae0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
32af0 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
32b00 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
32b10 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
32b20 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
32b30 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
32b40 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
32b50 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
32b60 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
32b70 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
32b80 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
32b90 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
32ba0 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
32bb0 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
32bc0 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
32bd0 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
32be0 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
32bf0 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
32c00 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
32c10 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
32c20 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
32c30 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
32c40 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
32c50 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
32c60 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
32c70 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
32c80 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
32c90 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
32ca0 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
32cb0 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
32cc0 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
32cd0 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
32ce0 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
32cf0 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
32d00 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
32d10 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
32d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
32d30 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
32d40 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
32d50 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
32d60 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
32d70 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
32d80 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
32d90 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
32da0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
32db0 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
32dc0 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
32dd0 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
32de0 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
32df0 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
32e00 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
32e10 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
32e20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
32e30 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
32e40 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
32e50 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
32e60 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
32e70 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
32e80 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
32e90 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
32ea0 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
32eb0 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
32ec0 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
32ed0 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
32ee0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
32ef0 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
32f00 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
32f10 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
32f20 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
32f30 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
32f40 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
32f50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
32f60 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
32f70 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
32f80 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
32f90 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
32fa0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
32fb0 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
32fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32fd0 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
32fe0 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
32ff0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
33000 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
33010 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
33020 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
33030 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
33040 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
33050 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
33060 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
33070 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
33080 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
33090 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
330a0 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
330b0 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
330c0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
330d0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
330e0 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
330f0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
33100 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
33110 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
33120 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
33130 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
33140 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
33150 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
33160 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
33170 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
33180 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
33190 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
331a0 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
331b0 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
331c0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
331d0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
331e0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
331f0 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
33200 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
33210 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
33220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
33230 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
33240 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
33250 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
33260 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
33270 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
33280 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
33290 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
332a0 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
332b0 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
332c0 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
332d0 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
332e0 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
332f0 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
33300 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
33310 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
33320 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
33330 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
33340 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
33350 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
33360 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
33370 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
33380 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
33390 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
333a0 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
333b0 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
333c0 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
333d0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
333e0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
333f0 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
33400 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
33410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
33420 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
33430 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
33440 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
33450 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
33460 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
33470 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
33480 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
33490 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
334a0 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
334b0 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
334c0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
334d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
334e0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
334f0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
33500 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
33510 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
33520 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
33530 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
33540 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
33550 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
33560 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
33570 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
33580 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
33590 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
335a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
335b0 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
335c0 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
335d0 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
335e0 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
335f0 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
33600 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
33610 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
33620 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
33630 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
33640 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
33650 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
33660 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
33670 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
33680 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
33690 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
336a0 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
336b0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
336c0 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
336d0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
336e0 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
336f0 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
33700 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
33710 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
33720 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
33730 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
33740 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
33750 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
33760 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
33770 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
33780 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
33790 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
337a0 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
337b0 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
337c0 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
337d0 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
337e0 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
337f0 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
33800 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
33810 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
33820 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
33830 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
33840 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
33850 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
33860 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
33870 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
33880 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
33890 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
338a0 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
338b0 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
338c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
338d0 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
338e0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
338f0 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
33900 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
33910 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
33920 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
33930 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
33940 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
33950 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
33960 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
33970 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
33980 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
33990 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
339a0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
339b0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
339c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
339d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
339e0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
339f0 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
33a00 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
33a10 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
33a20 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
33a30 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
33a40 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
33a50 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
33a60 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
33a70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
33a80 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33a90 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
33aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
33ab0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
33ac0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
33ad0 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
33ae0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
33af0 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
33b00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
33b10 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
33b20 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
33b30 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
33b40 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
33b50 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
33b60 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
33b70 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
33b80 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
33b90 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
33ba0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33bc0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
33bd0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
33be0 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
33bf0 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
33c00 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
33c10 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
33c20 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
33c30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
33c40 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
33c50 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
33c60 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
33c70 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
33c80 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
33c90 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
33ca0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
33cb0 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
33cc0 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
33cd0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
33ce0 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
33cf0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
33d00 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
33d10 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
33d20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
33d30 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
33d40 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
33d50 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
33d60 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
33d70 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
33d80 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
33d90 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
33da0 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
33db0 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
33dc0 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
33dd0 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
33de0 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
33df0 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
33e00 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
33e10 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
33e20 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
33e30 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
33e40 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
33e50 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
33e60 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
33e70 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
33e80 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
33e90 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
33ea0 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
33eb0 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
33ec0 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
33ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33ee0 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
33ef0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
33f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
33f10 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
33f20 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
33f30 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
33f40 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
33f50 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
33f60 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
33f70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
33f80 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
33f90 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
33fa0 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
33fb0 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
33fc0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
33fd0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
33fe0 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
33ff0 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
34000 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
34010 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
34020 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
34030 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
34040 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
34050 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
34060 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
34070 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
34080 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
34090 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
340a0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
340b0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
340c0 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
340d0 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
340e0 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
340f0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
34100 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
34110 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
34120 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
34130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34140 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
34150 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
34160 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
34170 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
34180 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
34190 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
341a0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
341b0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
341c0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
341d0 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
341e0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
341f0 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
34200 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
34210 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
34220 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
34230 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
34240 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
34250 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
34260 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
34270 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
34280 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
34290 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
342a0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
342b0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
342c0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
342d0 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
342e0 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
342f0 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
34300 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
34310 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
34320 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
34330 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
34340 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
34350 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
34360 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
34370 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
34380 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
34390 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
343a0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
343b0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
343c0 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
343d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
343e0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
343f0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
34400 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
34410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
34420 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
34430 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
34440 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
34450 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
34460 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
34490 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
344a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
344b0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
344c0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
344d0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
344e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
344f0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
34500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
34520 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
34530 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
34540 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
34550 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
34560 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
34570 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
34580 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
34590 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
345a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
345b0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
345c0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
345d0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
345e0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
345f0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
34600 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
34610 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
34620 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
34630 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
34640 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
34650 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
34660 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
34670 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
34680 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
34690 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
346a0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
346b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
346c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
346d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
346e0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
346f0 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
34700 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
34710 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
34720 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
34730 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
34740 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
34750 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
34760 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
34770 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
34780 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
34790 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
347a0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
347b0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
347c0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
347d0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
347e0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
347f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34800 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
34810 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
34820 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
34830 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
34840 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
34850 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
34860 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
34870 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
34880 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
34890 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
348a0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
348b0 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
348c0 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
348d0 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
348e0 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
348f0 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
34900 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
34910 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
34920 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
34930 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
34940 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
34950 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
34960 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
34970 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
34980 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
34990 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
349a0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
349b0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
349c0 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
349d0 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
349e0 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
349f0 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
34a00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
34a10 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
34a20 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
34a30 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
34a40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
34a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
34a60 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
34a70 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
34a80 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
34a90 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
34aa0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
34ab0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
34ac0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
34ad0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
34ae0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
34af0 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
34b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34b10 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
34b20 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
34b30 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
34b40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
34b50 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
34b60 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
34b70 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
34b80 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
34b90 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
34ba0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
34bb0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
34bc0 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
34bd0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
34be0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34bf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
34c00 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
34c10 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
34c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
34c30 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
34c40 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
34c50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34c60 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
34c70 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
34c80 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
34c90 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
34ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
34cb0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
34cc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
34cd0 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
34ce0 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
34cf0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
34d00 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
34d10 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
34d20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
34d30 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
34d40 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
34d50 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
34d60 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
34d70 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
34d80 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
34d90 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
34da0 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
34db0 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
34dc0 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
34dd0 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
34de0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
34df0 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
34e00 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
34e10 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
34e20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
34e30 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
34e40 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
34e50 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
34e60 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
34e70 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
34e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
34e90 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
34ea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34eb0 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
34ec0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
34ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
34ee0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
34ef0 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
34f00 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
34f10 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
34f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
34f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
34f40 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
34f50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
34f60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
34f70 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
34f80 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
34f90 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
34fa0 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
34fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
34fc0 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
34fd0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
34fe0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
34ff0 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
35000 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
35010 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
35020 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
35030 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
35040 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
35050 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
35060 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
35070 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
35080 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
35090 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
350a0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
350b0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
350c0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
350d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
350e0 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
350f0 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
35100 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
35110 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
35120 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
35130 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
35140 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
35150 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
35160 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
35170 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
35180 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
35190 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
351a0 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
351b0 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
351d0 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
351e0 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
351f0 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
35200 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
35210 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
35220 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
35230 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
35240 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
35250 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
35260 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
35270 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
35280 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
35290 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
352a0 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
352b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
352c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
352d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
352e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
352f0 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
35300 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
35310 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
35320 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
35330 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
35340 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
35350 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
35360 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
35370 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
35380 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
35390 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
353a0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
353b0 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
353c0 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
353d0 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
353e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
353f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
35400 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
35410 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
35420 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
35430 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
35440 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
35450 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
35460 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
35470 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
35480 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
35490 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
354a0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
354b0 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
354c0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
354d0 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
354e0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
354f0 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
35500 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
35510 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
35520 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
35530 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
35540 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
35550 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
35560 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
35570 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
35580 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
35590 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
355a0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
355b0 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
355c0 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
355d0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
355e0 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
355f0 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
35600 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
35610 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35620 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
35630 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
35640 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
35650 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35660 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
35670 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
35680 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
35690 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
356a0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
356b0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
356c0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
356d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
356e0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
356f0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
35700 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
35710 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
35720 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
35730 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
35740 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
35750 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
35760 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
35770 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
35780 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
35790 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
357a0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
357b0 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
357c0 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
357d0 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
357e0 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
357f0 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
35800 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
35810 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
35820 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
35830 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
35840 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
35850 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
35860 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
35870 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
35880 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
35890 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
358a0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
358b0 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
358c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
358d0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
358e0 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
358f0 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
35900 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
35910 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
35920 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
35930 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
35940 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
35950 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
35960 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
35970 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
35980 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
35990 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
359a0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
359b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
359c0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
359d0 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
359e0 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
359f0 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
35a00 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
35a10 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
35a20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
35a30 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
35a40 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
35a50 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
35a60 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
35a70 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
35a80 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
35a90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35aa0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
35ab0 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
35ac0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
35ad0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
35ae0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
35af0 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
35b00 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
35b10 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
35b20 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
35b30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35b40 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
35b50 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
35b60 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
35b70 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
35b80 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
35b90 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
35ba0 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
35bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35bc0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
35bd0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
35be0 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
35bf0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
35c00 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
35c10 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
35c20 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
35c30 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
35c40 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
35c50 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
35c60 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
35c70 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
35c80 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
35c90 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
35ca0 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
35cb0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
35cc0 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
35cd0 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
35ce0 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
35cf0 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
35d00 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
35d10 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
35d20 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
35d30 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
35d40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
35d50 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
35d60 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
35d70 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
35d80 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
35d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
35da0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
35db0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
35dc0 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
35dd0 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
35de0 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
35df0 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
35e00 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35e10 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
35e20 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
35e30 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
35e40 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
35e50 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35e60 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
35e70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
35e80 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35e90 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
35ea0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
35eb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
35ec0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35ed0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
35ee0 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
35ef0 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
35f00 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
35f10 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
35f20 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
35f30 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
35f40 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
35f50 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
35f60 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
35f70 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
35f80 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
35f90 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
35fa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
35fb0 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
35fc0 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
35fd0 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
35fe0 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
35ff0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
36000 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
36010 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
36020 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
36030 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
36040 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
36050 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
36060 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
36070 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
36080 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
36090 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
360a0 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
360b0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
360c0 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
360d0 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
360e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
360f0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
36100 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
36110 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
36120 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
36130 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
36140 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
36150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
36160 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
36170 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
36180 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
36190 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
361a0 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
361b0 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
361c0 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
361d0 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
361e0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
361f0 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
36200 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
36210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
36220 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
36230 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
36240 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
36250 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
36260 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
36270 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
36280 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
36290 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
362a0 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
362b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
362c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
362d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
362e0 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
362f0 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
36300 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
36310 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
36320 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
36330 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
36340 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
36350 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
36360 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
36370 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
36380 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
36390 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
363a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
363b0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
363c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
363d0 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
363e0 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
363f0 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
36400 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
36410 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
36420 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
36430 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
36440 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
36450 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
36460 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
36470 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
36480 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
36490 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
364a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
364b0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
364c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
364d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
364e0 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
364f0 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
36500 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
36510 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
36520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36530 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
36540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
36550 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
36560 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
36570 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
36580 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
36590 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
365a0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
365b0 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
365c0 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
365d0 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
365e0 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
365f0 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
36600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
36610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
36620 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
36630 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
36640 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
36650 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
36660 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
36670 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
36680 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
36690 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
366a0 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
366b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
366c0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
366d0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
366e0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
366f0 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
36700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36710 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
36720 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
36730 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
36740 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
36750 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
36760 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
36770 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
36780 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
36790 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
367a0 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
367b0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
367c0 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
367d0 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
367e0 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
367f0 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
36800 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
36810 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
36820 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
36830 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
36840 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
36850 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
36860 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
36870 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
36880 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
36890 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
368a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
368b0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
368c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
368d0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
368e0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
368f0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36900 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36910 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
36920 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
36930 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
36940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36950 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
36960 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
36970 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
36980 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
36990 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
369a0 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
369b0 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
369c0 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
369d0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
369e0 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
369f0 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
36a00 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
36a10 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
36a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
36a30 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
36a40 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
36a50 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
36a60 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
36a70 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
36a80 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
36a90 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
36aa0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
36ab0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
36ac0 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
36ad0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
36ae0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
36af0 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
36b00 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
36b10 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36b20 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
36b30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
36b40 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
36b50 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
36b60 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
36b70 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
36b80 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
36b90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
36ba0 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20  rrno = pError;. 
36bb0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
36bc0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
36bd0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
36be0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
36bf0 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c  HostID, SHARED_L
36c00 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
36c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36c20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
36c30 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
36c40 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65     /* read the e
36c50 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69  xisting conch fi
36c60 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65  le */.    readLe
36c70 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  n = seekAndRead(
36c80 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68  (unixFile*)conch
36c90 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66  File, 0, readBuf
36ca0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
36cb0 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65  LEN);.    if( re
36cc0 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  adLen<0 ){.     
36cd0 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c   /* I/O error: l
36ce0 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
36cf0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
36d00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
36d10 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c  Errno = conchFil
36d20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
36d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36d40 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20  IOERR_READ;.    
36d50 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
36d60 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20  onch;.    }else 
36d70 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52  if( readLen<=(PR
36d80 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
36d90 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c  OXY_HOSTIDLEN) |
36da0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
36db0 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61  readBuf[0]!=(cha
36dc0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
36dd0 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  SION ){.      /*
36de0 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72   a short read or
36df0 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20   version format 
36e00 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77  mismatch means w
36e10 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
36e20 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a   a new .      **
36e30 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20   conch file. .  
36e40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65      */.      cre
36e50 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20  ateConch = 1;.  
36e60 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68    }.    /* if th
36e70 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
36e80 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70  s and the lock p
36e90 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73  ath already exis
36ea0 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a  ts in the conch.
36eb0 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79      ** we'll try
36ec0 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68   to use the path
36ed0 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61   there, if we ca
36ee0 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61  n't open that pa
36ef0 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a  th, we'll .    *
36f00 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e  * retry with a n
36f10 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  ew auto-generate
36f20 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20  d path .    */. 
36f30 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61     do { /* in ca
36f40 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  se we need to tr
36f50 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a  y again for an :
36f60 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b  auto: named lock
36f70 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
36f80 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68  if( !createConch
36f90 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63   && !forceNewLoc
36fa0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
36fb0 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21   hostIdMatch = !
36fc0 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b  memcmp(&readBuf[
36fd0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
36fe0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20  , myHostID, .   
36ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
37010 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
37020 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74  .        /* if t
37030 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
37040 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
37050 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
37060 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
37070 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
37080 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
37090 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
370a0 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
370b0 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
370c0 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
370d0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68         ** use th
370e0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
370f0 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c  e path that's al
37100 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20  ready in there. 
37110 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
37120 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49         if( hostI
37130 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  dMatch ){.      
37140 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74        size_t pat
37150 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20  hLen = (readLen 
37160 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  - PROXY_PATHINDE
37170 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  X);.            
37180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37190 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54   pathLen>=MAXPAT
371a0 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  HLEN ){.        
371b0 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41        pathLen=MA
371c0 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20  XPATHLEN-1;.    
371d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
371e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63        memcpy(loc
371f0 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  kPath, &readBuf[
37200 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
37210 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  , pathLen);.    
37220 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68          lockPath
37230 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20  [pathLen] = 0;. 
37240 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c             tempL
37250 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
37260 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
37270 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
37280 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
37290 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
372a0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
372b0 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  h if the conch i
372c0 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
372d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
372e0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
372f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
37300 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d  else if( hostIdM
37310 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  atch.           
37320 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28      && !strncmp(
37330 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37340 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
37350 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a  OXY_PATHINDEX],.
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c             readL
37380 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en-PROXY_PATHIND
37390 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  EX).        ){. 
373a0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63           /* conc
373b0 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20  h host and lock 
373c0 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20  path match */.  
373d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
373e0 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20  _takeconch; .   
373f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37400 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69       .      /* i
37410 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  f the conch isn'
37420 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64  t writable and d
37430 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65  oesn't match, we
37440 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a   can't take it *
37450 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e  /.      if( (con
37460 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
37470 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29  s&O_RDWR) == 0 )
37480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
37490 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
374a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
374b0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
374c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
374d0 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68  either the conch
374e0 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72   didn't match or
374f0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
37500 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  te a new one */.
37510 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
37520 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
37530 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47  {.        proxyG
37540 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d  etLockPath(pCtx-
37550 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74  >dbPath, lockPat
37560 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
37570 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
37580 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
37590 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61  .        /* crea
375a0 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
375b0 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79   lock path _only
375c0 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  _ if the conch i
375d0 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
375e0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
375f0 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
37600 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
37610 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
37620 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
37630 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ess.      ** has
37640 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
37650 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20  lready), if the 
37660 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c  host id matches,
37670 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20   use the big.   
37680 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20     ** stick..   
37690 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69     */.      futi
376a0 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mes(conchFile->h
376b0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  , NULL);.      i
376c0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26  f( hostIdMatch &
376d0 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29  & !createConch )
376e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
376f0 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  nchFile->pInode 
37700 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  && conchFile->pI
37710 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
37720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
37730 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
37740 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
37750 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
37760 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
37770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
37780 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
37790 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
377a0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
377b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
377c0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
377d0 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
377e0 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
377f0 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
37800 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
37810 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
37820 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
37830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37840 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
37850 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
37860 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
37870 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
37880 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
37890 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
378a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
378b0 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
378c0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
378d0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
378e0 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
378f0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
37900 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
37910 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
37920 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
37930 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
37940 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
37950 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
37960 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
37970 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
37980 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
37990 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
379a0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
379b0 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
379c0 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
379d0 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
379e0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
379f0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
37a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37a10 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
37a20 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
37a30 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
37a40 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
37a50 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
37a60 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
37a70 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
37a80 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
37a90 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
37aa0 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
37ab0 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e      robust_ftrun
37ac0 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  cate(conchFile->
37ad0 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20  h, writeSize);. 
37ae0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
37af0 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
37b00 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
37b10 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72   writeBuffer, wr
37b20 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  iteSize, 0);.   
37b30 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68       fsync(conch
37b40 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
37b50 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74    /* If we creat
37b60 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66  ed a new conch f
37b70 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70  ile (not just up
37b80 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e  dated the conten
37b90 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20  ts of a .       
37ba0 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68    ** valid conch
37bb0 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d   file), try to m
37bc0 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73  atch the permiss
37bd0 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
37be0 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a  base .         *
37bf0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
37c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
37c10 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
37c20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
37c30 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20  tat buf;.       
37c40 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46     int err = osF
37c50 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
37c60 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  buf);.          
37c70 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20  if( err==0 ){.  
37c80 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74            mode_t
37c90 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f   cmode = buf.st_
37ca0 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f  mode&(S_IRUSR|S_
37cb0 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c  IWUSR | S_IRGRP|
37cc0 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20  S_IWGRP |.      
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cf0 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54    S_IROTH|S_IWOT
37d00 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  H);.            
37d10 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  /* try to match 
37d20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37d30 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e  e R/W permission
37d40 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72  s, ignore failur
37d50 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
37d60 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
37d70 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 46 63              osFc
37d80 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
37d90 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65  h, cmode);.#else
37da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b  .            do{
37db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
37dc0 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e  c = osFchmod(con
37dd0 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
37de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
37df0 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20  while( rc==(-1) 
37e00 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
37e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
37e20 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
37e30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
37e40 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
37e50 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
37e60 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
37e70 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
37e80 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ea0 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
37eb0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
37ec0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
37ed0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
37ee0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
37ef0 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
37f00 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
37f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
37f20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
37f30 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
37f40 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
37f50 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
37f60 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
37f70 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
37f80 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
37f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
37fa0 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
37fb0 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
37fc0 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
37fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37fe0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
37ff0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
38000 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
38010 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
38020 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
38030 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
38040 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
38050 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
38060 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
38070 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
38080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38090 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
380a0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
380b0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20 20   int fd;.       
380c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
380d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f   ){.          ro
380e0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
380f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
38100 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d  NE__);.        }
38110 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
38120 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  h = -1;.        
38130 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
38140 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
38150 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c  File->openFlags,
38160 20 30 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54   0);.        OST
38170 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
38180 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20  Y: OPEN  %d\n", 
38190 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fd));.        if
381a0 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
381b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
381c0 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  fd;.        }els
381d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  e{.          rc=
381e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
381f0 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f  BKPT; /* SQLITE_
38200 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43  BUSY? proxyTakeC
38210 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20  onch called.    
38220 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f         during lo
38230 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
38240 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
38250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38260 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63  OK && !pCtx->loc
38270 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
38280 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74    char *path = t
38290 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65  empLockPath ? te
382a0 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74  mpLockPath : pCt
382b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
382c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
382d0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
382e0 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
382f0 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20  lockProxy, 1);. 
38300 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
38310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
38320 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
38330 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29  tryOldLockPath )
38340 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77  {.          /* w
38350 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  e couldn't creat
38360 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  e the proxy lock
38370 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f   file with the o
38380 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  ld lock file pat
38390 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  h.           ** 
383a0 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61  so try again via
383b0 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20   auto-naming .  
383c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
383d0 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f        forceNewLo
383e0 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
383f0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
38400 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Path = 0;.      
38410 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
38420 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20   go back to the 
38430 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72  do {} while star
38440 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61  t point, try aga
38450 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  in */.        }.
38460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
38470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38480 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ){.        /* Ne
38490 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
384a0 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20  y of path if we 
384b0 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61  extracted the va
384c0 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  lue.         ** 
384d0 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66  from the conch f
384e0 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20  ile or the path 
384f0 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  was allocated on
38500 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   the stack.     
38510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
38520 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  f( tempLockPath 
38530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
38540 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
38550 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
38560 75 70 28 30 2c 20 74 65 6d