/ Hex Artifact Content
Login

Artifact 1e61abcb664f3430ce13e5c5f32b2b2e204a6f23:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 20 20  on */..#endif.  
22c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
22d0: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
22e0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
22f0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
2300: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
2310: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f  ite3_int64 mmapO
2320: 72 69 67 73 69 7a 65 3b 20 20 20 20 20 2f 2a 20  rigsize;     /* 
2330: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2340: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
2350: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
2360: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d 69  3_int64 mmapLimi
2370: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t;        /* Con
2380: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
2390: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23a0: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
23b0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
23c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
23d0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
23e0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
2410: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
2420: 72 65 66 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20  refs */..#ifdef 
2430: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2440: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2450: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2460: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2470: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
2480: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
2490: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
24a0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
24b0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
24c0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
24d0: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
24e0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
24f0: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2500: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2510: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2520: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2530: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2540: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2550: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2560: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2570: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2580: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
2590: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
25a0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
25b0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
25c0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
25d0: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
25e0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
25f0: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2600: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2610: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2620: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2630: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2640: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2650: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2660: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2670: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
2680: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
2690: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
26a0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
26b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
26c0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
26d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26e0: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
26f0: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2700: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2710: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2720: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2730: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2740: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2750: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2760: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2770: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
2780: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
2790: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
27a0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
27b0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
27c0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
27d0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
27e0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
27f0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2800: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2810: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2820: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2830: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2840: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2850: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2860: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2870: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2880: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2890: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
28a0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
28b0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
28c0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
28d0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
28e0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
28f0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2900: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2910: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2920: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2930: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2940: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2950: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2960: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2970: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2980: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2990: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
29a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
29b0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
29c0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
29d0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
29e0: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
29f0: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2a00: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2a10: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2a20: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2a30: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2a40: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2a50: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2a60: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2a70: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
2a80: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
2a90: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
2aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
2ab0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
2ac0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2ad0: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2ae0: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2af0: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2b00: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2b10: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2b20: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2b30: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2b40: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2b50: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2b60: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
2b70: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
2b80: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
2b90: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
2ba0: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
2bb0: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
2bc0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
2bd0: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
2be0: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
2bf0: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
2c00: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
2c10: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
2c20: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
2c30: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
2c40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2c50: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
2c60: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
2c70: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
2c80: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
2c90: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
2ca0: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
2cb0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2cc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2cd0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2ce0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2d00: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2d10: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2d20: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2d30: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2d40: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2d50: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2d60: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2d70: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2d80: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2d90: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2da0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2db0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2dc0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2dd0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2de0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2df0: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2e00: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2e10: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2e20: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e40: 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c  of the sytem cal
2e50: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
2e60: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
2e70: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
2e80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
2e90: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2ea0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2eb0: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
2ec0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
2ed0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
2ee0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
2ef0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2f00: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
2f10: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
2f20: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
2f30: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2f40: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
2f50: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
2f60: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
2f70: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2f80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
2f90: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
2fa0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
2fb0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2fc0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2fd0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
2fe0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
2ff0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3000: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
3010: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
3020: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
3030: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3040: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
3050: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3060: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
3070: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3080: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
3090: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
30a0: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
30b0: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
30c0: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
30d0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
30e0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
30f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3100: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
3110: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
3120: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
3130: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
3140: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3150: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
3160: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
3170: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
3180: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
3190: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
31a0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
31b0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
31c0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
31d0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
31e0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
31f0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
3200: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
3210: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
3220: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
3230: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
3240: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
3250: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
3260: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
3270: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
3280: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
32a0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
32b0: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
32c0: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
32d0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
32e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
32f0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
3300: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3310: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
3320: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
3330: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
3340: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
3350: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
3360: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3370: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
3380: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
3390: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
33a0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
33b0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
33c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
33d0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
33e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
33f0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
3400: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3410: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
3420: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
3440: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
3450: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
3460: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3470: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
3480: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
3490: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
34a0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34b0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
34c0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
34d0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
34e0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
34f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3500: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
3510: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3520: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
3530: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
3540: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
3550: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3560: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3570: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3580: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3590: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
35a0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
35b0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
35c0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
35d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
35e0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
35f0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3600: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3610: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
3620: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
3630: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3640: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3650: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3660: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3670: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3680: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
3690: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
36a0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
36b0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
36c0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
36d0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
36e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
36f0: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
3700: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
3710: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3720: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3730: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3740: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3750: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3760: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
3770: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3780: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
3790: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
37a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
37b0: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
37c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
37d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
37e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
37f0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3800: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3810: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
3820: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3830: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3840: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3860: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
3870: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3880: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
3890: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
38a0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
38b0: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
38c0: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
38d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
38e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
38f0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3900: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3910: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
3920: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
3930: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
3940: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3950: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3960: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3970: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3980: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3990: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
39a0: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
39b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
39c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
39d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
39e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
39f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a00: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3a10: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3a20: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3a30: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3a40: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3a50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3a60: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3a70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3a80: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3a90: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3aa0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3ad0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3ae0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3af0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3b00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3b10: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3b20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b30: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3b40: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b50: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3b60: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b70: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3b80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3b90: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
3ba0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3bb0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
3bc0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
3bd0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
3be0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
3bf0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3c00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3c10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3c30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3c50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3c70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3c80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3c90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3ca0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3cb0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3cc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3cd0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ce0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3cf0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3d00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3d10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3d20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3d30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
3d50: 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30 20  ixFchown,     0 
3d60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3d70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3d80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3d90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3da0: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
3db0: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
3dc0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3dd0: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
3de0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
3df0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
3e00: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
3e10: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
3e20: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
3e30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3e40: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
3e50: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
3e60: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
3e70: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
3e80: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
3e90: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
3ea0: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
3eb0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
3ec0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
3ed0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
3ee0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
3ef0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
3f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
3f10: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
3f20: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
3f30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
3f40: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3f50: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
3f60: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
3f70: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3f80: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
3f90: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
3fa0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
3fb0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
3fc0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
3fd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
3fe0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
3ff0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4000: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4010: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4020: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4030: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4040: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4050: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4060: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4070: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4080: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4090: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
40a0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
40b0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
40c0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
40d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
40f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4100: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4110: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4120: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4140: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4150: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4160: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4170: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4180: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4190: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
41a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
41b0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
41c0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
41d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
41e0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
41f0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4200: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4210: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4220: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4230: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4240: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4250: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4260: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4270: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4280: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4290: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
42a0: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
42b0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
42c0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
42d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
42e0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
42f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4300: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4320: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4330: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4340: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4350: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4360: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4370: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4380: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4390: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
43a0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
43b0: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
43c0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
43d0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
43e0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
43f0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4400: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4410: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
4420: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
4430: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
4440: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4450: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
4460: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4470: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
4480: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
4490: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
44a0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
44b0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
44c0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
44d0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
44e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
44f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4500: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4510: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
4520: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
4530: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
4540: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
4550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4560: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
4570: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4580: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
4590: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
45a0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
45b0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
45c0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
45d0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
45e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
45f0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
4600: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
4610: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4620: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4630: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
4640: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
4650: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
4660: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4670: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
4680: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4690: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
46a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
46b0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
46d0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
46e0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
46f0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4700: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
4710: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
4720: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
4730: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4740: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e  *.** Invoke open
4750: 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69  ().  Do so multi
4760: 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c  ple times, until
4770: 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65   it either succe
4780: 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20  eds or.** fails 
4790: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20  for some reason 
47a0: 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52  other than EINTR
47b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
47c0: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
47d0: 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20  e "m" is 0 then 
47e0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65  set it to the de
47f0: 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c  fault for.** SQL
4800: 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ite.  The defaul
4810: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41  t is SQLITE_DEFA
4820: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4830: 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a  IONS (normally.*
4840: 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66  * 0644) as modif
4850: 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65  ied by the syste
4860: 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69  m umask.  If m i
4870: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a  s not 0, then.**
4880: 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63   make the file c
4890: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20  reation mode be 
48a0: 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69  exactly m ignori
48b0: 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  ng the umask..**
48c0: 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65  .** The m parame
48d0: 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d  ter will be non-
48e0: 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63  zero only when c
48f0: 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a  reating -wal, -j
4900: 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d  ournal,.** and -
4910: 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77  shm files.  We w
4920: 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20  ant those files 
4930: 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79  to have *exactly
4940: 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65  * the same.** pe
4950: 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65  rmissions as the
4960: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
4970: 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61  base, unadultera
4980: 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
4990: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79  ..** In that way
49a0: 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  , if a database 
49b0: 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72  file is -rw-rw-r
49c0: 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20  w or -rw-rw-r-, 
49d0: 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63  and a.** transac
49e0: 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64  tion crashes and
49f0: 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68   leaves behind h
4a00: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  ot journals, the
4a10: 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73  n any.** process
4a20: 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f   that is able to
4a30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
4a40: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f  tabase will also
4a50: 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72   be able to.** r
4a60: 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a  ecover the hot j
4a70: 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ournals..*/.stat
4a80: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
4a90: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
4aa0: 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20  , int f, mode_t 
4ab0: 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  m){.  int fd;.  
4ac0: 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20  mode_t m2 = m ? 
4ad0: 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m : SQLITE_DEFAU
4ae0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4af0: 4f 4e 53 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  ONS;.  do{.#if d
4b00: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
4b10: 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  ).    fd = osOpe
4b20: 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c  n(z,f|O_CLOEXEC,
4b30: 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  m2);.#else.    f
4b40: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d  d = osOpen(z,f,m
4b50: 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 77 68  2);.#endif.  }wh
4b60: 69 6c 65 28 20 66 64 3c 30 20 26 26 20 65 72 72  ile( fd<0 && err
4b70: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 69  no==EINTR );.  i
4b80: 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
4b90: 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
4ba0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
4bb0: 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  atbuf;.      if(
4bc0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
4bd0: 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20 20  atbuf)==0 .     
4be0: 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74 5f    && statbuf.st_
4bf0: 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20 26  size==0.       &
4c00: 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  & (statbuf.st_mo
4c10: 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20 20  de&0777)!=m .   
4c20: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73     ){.        os
4c30: 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a 20  Fchmod(fd, m);. 
4c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
4c50: 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f 45   defined(FD_CLOE
4c60: 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e 65  XEC) && (!define
4c70: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c 20  d(O_CLOEXEC) || 
4c80: 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20 20  O_CLOEXEC==0).  
4c90: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
4ca0: 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
4cb0: 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
4cc0: 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
4cd0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
4ce0: 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n fd;.}../*.** H
4cf0: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
4d00: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
4d10: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
4d20: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
4d30: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
4d40: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
4d50: 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  t the unixInodeI
4d60: 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72  nfo and.** vxwor
4d70: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73  ksFileId objects
4d80: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69   used by this fi
4d90: 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
4da0: 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72   may be .** shar
4db0: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
4dc0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
4dd0: 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78  nction unixMutex
4de0: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
4df0: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
4e00: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
4e10: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
4e20: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
4e30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
4e40: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
4e50: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
4e60: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
4e70: 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  **.**   unixEnte
4e80: 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
4e90: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
4ea0: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
4eb0: 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29  unixEnterLeave()
4ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ed0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
4ee0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4ef0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
4f00: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4f10: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4f20: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
4f30: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
4f40: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
4f50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4f60: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
4f70: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4f80: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4f90: 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  ER));.}.#ifdef S
4fa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
4fb0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78  ic int unixMutex
4fc0: 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
4fd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
4fe0: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
4ff0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
5000: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
5010: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
5020: 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f...#if defined(
5030: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
5040: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5050: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  EBUG)./*.** Help
5060: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
5070: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
5080: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
5090: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
50a0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
50b0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
50c0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
50d0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
50e0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
50f0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5110: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5120: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5130: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5140: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5150: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5160: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
5170: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
5180: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
5190: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
51a0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
51b0: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
51c0: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
51d0: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
51e0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
51f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5200: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5210: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5220: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5230: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5240: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
5250: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5260: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
5270: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
5280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5290: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
52a0: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
52b0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
52c0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
52d0: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
52e0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
52f0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5300: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
5310: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
5320: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
5330: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
5340: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
5350: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
5360: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
5370: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
5380: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
5390: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
53a0: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
53b0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
53c0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
53d0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
53e0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
53f0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
5400: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
5410: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
5420: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
5430: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5440: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5450: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
5460: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
5470: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
5480: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
5490: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
54a0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
54b0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
54c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
54d0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
54e0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
54f0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
5500: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
5510: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
5520: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
5530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5540: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
5550: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
5560: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
5570: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
5580: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
5590: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
55a0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
55b0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
55c0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
55d0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
55e0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
55f0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
5600: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
5610: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
5620: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
5630: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
5640: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
5650: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
5660: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
5670: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
5680: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
5690: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
56a0: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
56b0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
56c0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
56d0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
56e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
56f0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
5700: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
5710: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
5720: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5730: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
5740: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
5750: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5760: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
5770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5780: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
5790: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
57a0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
57b0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
57c0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
57d0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
57e0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
57f0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
5800: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
5810: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
5820: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
5830: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
5840: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
5850: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
5860: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5870: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
5880: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
5890: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
58a0: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
58b0: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
58c0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
58d0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
58e0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
58f0: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
5900: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
5910: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
5920: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
5930: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
5940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5950: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
5960: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
5970: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
5980: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
5990: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
59a0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
59b0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
59c0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
59d0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
59e0: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
59f0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
5a00: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
5a10: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
5a20: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
5a30: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
5a40: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
5a50: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
5a60: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
5a70: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
5a80: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
5a90: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
5aa0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
5ab0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
5ac0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
5ad0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
5ae0: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
5af0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
5b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5b10: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
5b20: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
5b30: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
5b40: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
5b50: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
5b60: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
5b70: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
5b80: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
5b90: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
5ba0: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
5bb0: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
5bc0: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
5bd0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
5be0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
5bf0: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
5c00: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
5c10: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
5c20: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
5c30: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
5c40: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
5c50: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
5c60: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5c70: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
5c80: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
5c90: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
5ca0: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
5cb0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
5cc0: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
5cd0: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
5ce0: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
5cf0: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
5d00: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
5d10: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
5d20: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
5d30: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
5d40: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
5d50: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
5d60: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
5d70: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
5d80: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
5d90: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
5da0: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
5db0: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
5dc0: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
5dd0: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
5de0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5df0: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
5e00: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
5e10: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
5e20: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
5e30: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
5e40: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
5e50: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
5e60: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
5e70: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
5e80: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
5e90: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
5ea0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
5eb0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
5ec0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
5ed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5ee0: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
5ef0: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
5f00: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
5f10: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
5f20: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
5f40: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
5f50: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
5f60: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
5f70: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
5f80: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
5f90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
5fa0: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
5fb0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
5fc0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
5fd0: 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20  DLOCK) ||.      
5fe0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
5ff0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6000: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6010: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6020: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6030: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
6040: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
6050: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
6060: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6070: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f  E_PERM;.    .  /
6080: 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c  * EDEADLK is onl
6090: 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20  y possible if a 
60a0: 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f  call to fcntl(F_
60b0: 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e  SETLKW) is made.
60c0: 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d   And.  ** this m
60d0: 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65  odule never make
60e0: 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41  s such a call. A
60f0: 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53  nd the code in S
6100: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20  QLite itself .  
6110: 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
6120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6130: 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65  CKED is never re
6140: 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73  turned. For thes
6150: 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74  e reasons.  ** t
6160: 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
6170: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
6180: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f  If the system do
6190: 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20  es set errno to 
61a0: 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68  EDEADLK,.  ** th
61b0: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
61c0: 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20  _IOERR_XXX code 
61d0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
61e0: 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73  . */.#if 0.  cas
61f0: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6210: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64  RR_BLOCKED;.#end
6220: 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  if.    .#if EOPN
6230: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
6240: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
6250: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
6260: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
6270: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
6280: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
6290: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
62a0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
62b0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
62c0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
62d0: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
62e0: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
62f0: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
6300: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
6310: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
6320: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
6330: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
6340: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6350: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
6360: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
6370: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
6380: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
6390: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
63a0: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
63b0: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
63c0: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
63d0: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
63e0: 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45  ENOENT:.#ifdef E
63f0: 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20  STALE           
6400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54            /* EST
6410: 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  ALE is not defin
6420: 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79  ed on Interix sy
6430: 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20  stems */.  case 
6440: 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20  ESTALE:.#endif. 
6450: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
6460: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
6470: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
6480: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
6490: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
64a0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
64b0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
64c0: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
64d0: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
6540: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6550: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6560: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6570: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
6580: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
6590: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
65a0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
65b0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
65c0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
65d0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
65e0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
65f0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
6600: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
6610: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
6620: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
6630: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
6640: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
6650: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
6660: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
6670: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
6680: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6690: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
66a0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
66b0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
66c0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
66d0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
66e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
66f0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
6700: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
6710: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
6720: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
6730: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
6740: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
6750: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
6760: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6770: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
6780: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
6790: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
67a0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
67b0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
67c0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
67d0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
67e0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
67f0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
6800: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
6810: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
6820: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
6830: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
6840: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6850: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
6860: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6870: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
6880: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
6890: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
68a0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
68c0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
68d0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
68e0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6900: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
6910: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
6920: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
6930: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
6940: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
6950: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6960: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
6970: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
6980: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
6990: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
69a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
69b0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
69c0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
69d0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
69e0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
69f0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
6a00: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
6a10: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
6a20: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
6a30: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
6a40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
6a50: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
6a60: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
6a70: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
6a80: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
6a90: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
6aa0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
6ab0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
6ac0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
6ad0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
6ae0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
6af0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
6b00: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
6b10: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
6b20: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
6b30: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
6b40: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
6b50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6b60: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
6b70: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
6b80: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
6b90: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
6ba0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
6bb0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
6bc0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
6bd0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
6be0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
6bf0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
6c00: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
6c10: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
6c20: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
6c30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6c40: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6c50: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
6c60: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6c70: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
6c80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6c90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
6ca0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
6cb0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
6cc0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
6cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
6ce0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
6cf0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
6d00: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
6d10: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
6d20: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
6d30: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
6d50: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
6d60: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
6d70: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
6d80: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
6d90: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
6da0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
6db0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
6dc0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
6dd0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
6de0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
6df0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
6e00: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
6e10: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
6e20: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
6e30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6e40: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
6e50: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
6e60: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
6e70: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
6e80: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6e90: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
6ea0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
6eb0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
6ec0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
6ed0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
6ee0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
6ef0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
6f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
6f10: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6f20: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
6f30: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
6f40: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
6f50: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6f60: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
6f70: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
6f80: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
6f90: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
6fa0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6fb0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
6fc0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
6fd0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
6fe0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7010: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
7020: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
7030: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
7040: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
7050: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
7060: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
7070: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
7080: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7090: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
70a0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
70b0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
70c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
70d0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
70e0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
70f0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
7100: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
7110: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
7120: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7130: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7140: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7150: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
7160: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
7170: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
7180: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
7190: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
71a0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
71b0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
71c0: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
71d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
71e0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
71f0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
7200: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7210: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
7220: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7230: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7240: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7250: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
7260: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
7270: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
7280: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
7290: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
72a0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
72b0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
72c0: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
72d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
72e0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
72f0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7300: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7310: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7320: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7330: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7340: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7350: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7360: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7370: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7380: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7390: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
73a0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
73b0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
73c0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
73d0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
73e0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
73f0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7400: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7410: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7420: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7430: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7440: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7450: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7460: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7470: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7480: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7490: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
74a0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
74b0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
74c0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
74d0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
74e0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
74f0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7500: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7510: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7520: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7530: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7540: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7550: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7560: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7570: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7580: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7590: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
75a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
75b0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
75c0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
75d0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
75e0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
75f0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7600: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7610: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7620: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7630: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7700: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7720: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7730: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7740: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7750: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7760: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7770: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7780: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7790: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
77a0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
77b0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
77c0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
77d0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
77e0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
77f0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7800: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7810: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7820: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
7830: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
7840: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
7850: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
7860: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
7870: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
7880: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7890: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
78a0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
78b0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
78c0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
78d0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
78e0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
78f0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
7900: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
7910: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
7920: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
7930: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
7940: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
7950: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
7960: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
7970: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
7980: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
7990: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
79a0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
79b0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
79c0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
79d0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
79e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
79f0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
7a00: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
7a10: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
7a20: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
7a30: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
7a40: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
7a50: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
7a60: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
7a70: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
7a80: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
7a90: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
7aa0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
7ab0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
7ac0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
7ad0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
7ae0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
7af0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7b00: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
7b10: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
7b20: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
7b30: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
7b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
7b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
7b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
7b70: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
7b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
7b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
7bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
7bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
7bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
7be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
7bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
7c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
7c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
7c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
7c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
7c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
7c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
7c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
7c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
7c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
7c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
7ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
7cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
7cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
7cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
7cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
7d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
7d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
7d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
7d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
7d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
7d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
7d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
7d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
7d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
7da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
7db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
7dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
7dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
7de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
7df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
7e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
7e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
7e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
7e30: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
7e40: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
7e50: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
7e60: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
7e70: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
7e80: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
7e90: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
7ea0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
7eb0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
7ec0: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
7ed0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
7ee0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
7ef0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
7f00: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
7f10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
7f20: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
7f30: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
7f40: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
7f50: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
7f60: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
7f70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
7f80: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
7f90: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
7fa0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
7fb0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
7fc0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
7fd0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
7fe0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
7ff0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
8000: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
8010: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8020: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8030: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8040: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8050: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
8060: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
8070: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
8080: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
8090: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
80a0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
80b0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
80c0: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
80d0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
80e0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
80f0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
8100: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
8110: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
8120: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8130: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8140: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8150: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
8160: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
8170: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
8180: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
8190: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
81a0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
81b0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
81c0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
81d0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
81e0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
81f0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
8200: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
8210: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
8220: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8230: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8240: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8250: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8260: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
8270: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
8280: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
8290: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
82a0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
82b0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
82c0: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
82d0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
82e0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
82f0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8310: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8320: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8330: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8340: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8350: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8360: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8370: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8380: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8390: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
83a0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
83b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
83c0: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
83d0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
83e0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
83f0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8400: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8410: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8420: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8430: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8440: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8450: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8460: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8470: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8480: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8490: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
84a0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
84b0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
84c0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
84d0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
84e0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
84f0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8500: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8510: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8520: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8530: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8540: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8550: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8560: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8570: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8580: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8590: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
85a0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
85b0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
85c0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
85d0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
85e0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
85f0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8600: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8610: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8620: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8630: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8640: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8650: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8660: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8670: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8680: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8690: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
86a0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
86b0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
86c0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
86d0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
86e0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
86f0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8700: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8710: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8720: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8730: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8740: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8750: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8760: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8770: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8780: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8790: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
87a0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
87b0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
87c0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
87d0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
87e0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
87f0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8800: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8810: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8820: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
8830: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
8840: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
8850: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
8860: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
8870: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
8880: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
8890: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
88a0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
88b0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
88c0: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
88d0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
88e0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
88f0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
8900: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
8910: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
8920: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
8930: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
8940: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
8950: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
8960: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
8970: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8980: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
8990: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
89a0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
89b0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
89c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
89d0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
89e0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
89f0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
8a00: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
8a10: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
8a20: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
8a30: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
8a40: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
8a50: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8a70: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
8a80: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8a90: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
8aa0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
8ab0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
8ac0: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
8ad0: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
8b00: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
8b10: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
8b20: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
8b30: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
8b40: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
8b50: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
8b60: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
8b70: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
8b80: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
8b90: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
8ba0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
8bb0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
8bc0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
8bd0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
8be0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
8bf0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
8c00: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
8c10: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8c20: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
8c30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8c40: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
8c50: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
8c60: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
8c70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
8c80: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
8c90: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
8ca0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
8cb0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
8cc0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
8cd0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
8ce0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
8cf0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
8d00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8d10: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
8d20: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
8d30: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
8d40: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
8d50: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
8d60: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
8d70: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
8d80: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
8d90: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
8da0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
8db0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
8dc0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8df0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
8e00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8e10: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
8e20: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
8e30: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
8e40: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
8e50: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
8e60: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
8ea0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
8eb0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
8ec0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
8ed0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
8ee0: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
8ef0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
8f00: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
8f10: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8f20: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
8f30: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
8f40: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
8f50: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
8f60: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
8f70: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
8f80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
8f90: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
8fa0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
8fb0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
8fc0: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
8fd0: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
8fe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
8ff0: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
9000: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
9010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9020: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
9030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
9040: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
9050: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
9060: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
9070: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9080: 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20  *.** A lists of 
9090: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
90a0: 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  o objects..*/.st
90b0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
90c0: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
90d0: 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  0;../*.**.** Thi
90e0: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69  s function - uni
90f0: 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69  xLogError_x(), i
9100: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
9110: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
9120: 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  .** unixLogError
9130: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ()..**.** It is 
9140: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
9150: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
9160: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   an OS function 
9170: 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65  and errno has be
9180: 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f  en.** set. It lo
9190: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
91a0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
91b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
91c0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
91d0: 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69  .** errno and, i
91e0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
91f0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
9200: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73  quivalent from s
9210: 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20  trerror() or.** 
9220: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a  strerror_r()..**
9230: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
9240: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
9250: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
9260: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
9270: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
9280: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
9290: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
92a0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
92b0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
92c0: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
92d0: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
92e0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
92f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
9300: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
9310: 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20  ** failed (e.g. 
9320: 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22  "unlink", "open"
9330: 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  ) and the associ
9340: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
9350: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
9360: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
9370: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
9380: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
9390: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
93a0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
93b0: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
93c0: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
93d0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
93e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
93f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
9400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9410: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
9420: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
9430: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
9440: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
9450: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
9460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9470: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
9480: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
9490: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
94c0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
94d0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
94e0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
94f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9500: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
9510: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9520: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
9530: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
9540: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
9550: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
9560: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
9570: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
9580: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
9590: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
95a0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
95b0: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
95c0: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
95d0: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
95e0: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
95f0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
9600: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
9610: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
9620: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
9630: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
9640: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
9650: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
9660: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
9670: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
9680: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
9690: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
96a0: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
96b0: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
96c0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
96d0: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
96e0: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
96f0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
9700: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
9710: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9720: 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55  provides the GNU
9730: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
9740: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20  rror_r() that.  
9750: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
9760: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
9770: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
9790: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
97a0: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
97b0: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
97c0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
97d0: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
97e0: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
97f0: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
9800: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9810: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
9820: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
9830: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
9840: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
9850: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
9860: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
9870: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
9880: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
9890: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
98a0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
98b0: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
98c0: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
98d0: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
98e0: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
98f0: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
9900: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
9910: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
9920: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
9930: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
9940: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
9950: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
9960: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
9970: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
9980: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
9990: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
99a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
99b0: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
99c0: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
99d0: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
99e0: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
99f0: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
9a00: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
9a10: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
9a20: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
9a30: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
9a40: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
9a50: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
9a60: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
9a70: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
9a80: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
9a90: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
9aa0: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
9ab0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9ac0: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
9ad0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
9ae0: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
9af0: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
9b00: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
9b10: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
9b20: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
9b30: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
9b40: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
9b50: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
9b60: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
9b70: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
9b80: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
9b90: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
9ba0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
9bb0: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
9bc0: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
9bd0: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
9be0: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
9bf0: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
9c00: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
9c10: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
9c20: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
9c30: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
9c40: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
9c50: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
9c60: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
9c70: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
9c80: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
9c90: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
9ca0: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
9cb0: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
9cc0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
9cd0: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
9ce0: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
9cf0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
9d00: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
9d10: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
9d20: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
9d30: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
9d40: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
9d50: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
9d60: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
9d70: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
9d80: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
9d90: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
9da0: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
9db0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9dc0: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
9dd0: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
9e00: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
9e10: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
9e20: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9e30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9e40: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9e50: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9e60: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9e70: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9e80: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9e90: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9ea0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9eb0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ec0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9ed0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9ee0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9ef0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9f00: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9f10: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9f20: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
9f30: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
9f40: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
9f50: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
9f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
9f70: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
9f80: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
9f90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
9fa0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
9fb0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
9fc0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
9fd0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
9fe0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
9ff0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a000: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a010: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a020: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a030: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a040: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a050: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a060: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a070: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a080: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a090: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a0a0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a0b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a0c0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a0d0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a0e0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a0f0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a100: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a110: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a120: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a130: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a140: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a150: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a160: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a170: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a180: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a190: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a1a0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a1b0: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a1c0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a1d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a1e0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a1f0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a200: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a210: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a220: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a230: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a250: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a260: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a270: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a280: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a290: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a2a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a2b0: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a2d0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a2e0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a2f0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a300: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a310: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a320: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a330: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a340: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a350: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a360: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a370: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a380: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a390: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a3a0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a3b0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a3c0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a3d0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a3e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a3f0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a400: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a410: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a420: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a430: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a440: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a450: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a460: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a470: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a480: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a490: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a4a0: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a4b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a4c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a4d0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a4e0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a510: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a520: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a550: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a560: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a570: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a580: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a590: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a5a0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a5b0: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a5c0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a5d0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a5e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a5f0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a600: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a610: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a620: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a630: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a640: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a650: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a660: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a670: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a680: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a690: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a6a0: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a6b0: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a6c0: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a6d0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a6e0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a6f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a700: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
a710: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
a720: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
a730: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
a740: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
a750: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
a760: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
a770: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
a780: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
a790: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
a7a0: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
a7b0: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
a7c0: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
a7d0: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
a7e0: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
a7f0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
a800: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
a810: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
a820: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
a830: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
a840: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
a850: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
a860: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
a870: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
a880: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
a890: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
a8a0: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
a8b0: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
a8c0: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
a8d0: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
a8e0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
a8f0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
a900: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
a910: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
a920: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
a930: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
a940: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
a950: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
a960: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
a970: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
a980: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
a990: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
a9a0: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
a9b0: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
a9c0: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
a9d0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
a9e0: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
a9f0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
aa00: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
aa10: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
aa20: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
aa30: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
aa40: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
aa50: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
aa60: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
aa70: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
aa80: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
aa90: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
aaa0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
aab0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
aac0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aad0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
aae0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
aaf0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
ab00: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
ab10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ab20: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ab30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ab40: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
ab50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
ab60: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
ab70: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ab80: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
ab90: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
aba0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
abb0: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
abc0: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
abd0: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
abe0: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
abf0: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
ac00: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
ac10: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
ac20: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
ac30: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
ac40: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ac50: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
ac60: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
ac70: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
ac80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
ac90: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
aca0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
acb0: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
acc0: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
acd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ace0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
acf0: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
ad00: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
ad10: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
ad20: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
ad30: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
ad40: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
ad50: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
ad60: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
ad70: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
ad80: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
ad90: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
ada0: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
adb0: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
adc0: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
add0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
ade0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
adf0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
ae00: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
ae10: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
ae20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
ae30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ae40: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
ae50: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
ae60: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
ae70: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
ae80: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ae90: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
aea0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
aeb0: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
aec0: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
aed0: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
aee0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
aef0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
af00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
af10: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
af20: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
af30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
af40: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
af50: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
af60: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
af70: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
af80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
af90: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
afa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
afb0: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
afc0: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
afd0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
afe0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
aff0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
b000: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
b010: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
b020: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
b030: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
b040: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
b050: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
b060: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
b070: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
b080: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
b090: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
b0a0: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
b0b0: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
b0c0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
b0d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
b0e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
b0f0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
b100: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
b110: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
b120: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
b130: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
b140: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
b150: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
b160: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
b170: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
b180: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
b190: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
b1a0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b1b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
b1c0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
b1d0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
b1e0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
b1f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b200: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
b210: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b220: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
b230: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
b240: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b250: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
b260: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
b270: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b280: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
b290: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
b2a0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  NLCK ){.      re
b2b0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
b2c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
b2d0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
b2e0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
b2f0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
b300: 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  %d %d (unix)\n",
b310: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
b320: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
b330: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
b340: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
b350: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
b360: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
b370: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
b380: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
b390: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
b3a0: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
b3b0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
b3c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
b3d0: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
b3e0: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
b3f0: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
b400: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
b410: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
b420: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
b430: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
b440: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
b450: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
b460: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
b470: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
b480: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
b490: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
b4a0: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
b4b0: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
b4c0: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
b4d0: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
b4e0: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
b4f0: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
b500: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
b510: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
b520: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
b530: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
b540: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
b550: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
b560: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
b570: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
b580: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
b590: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b5a0: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
b5b0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
b5c0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
b5d0: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
b5e0: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
b5f0: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
b600: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
b610: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
b620: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
b630: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
b640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
b650: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
b660: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
b670: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
b680: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
b690: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
b6a0: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
b6b0: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
b6c0: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
b6d0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
b6e0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
b6f0: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
b700: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
b710: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
b720: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
b730: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
b740: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
b750: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
b760: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
b770: 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74   if( ((pFile->ct
b780: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
b790: 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70  LE_EXCL)!=0 || p
b7a0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b7b0: 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69  ock).   && ((pFi
b7c0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
b7d0: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
b7e0: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ==0).  ){.    if
b7f0: 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
b800: 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
b810: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
b820: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
b830: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
b840: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f  k==0 );.      lo
b850: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
b860: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
b870: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
b880: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
b890: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
b8a0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
b8b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b8c0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63  _WRLCK;.      rc
b8d0: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
b8e0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b8f0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
b900: 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63  rc<0 ) return rc
b910: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
b920: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31  bProcessLock = 1
b930: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
b940: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nLock++;.    }el
b950: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
b960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b970: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
b980: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b990: 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d  TLK, pLock);.  }
b9a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b9b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
b9c0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
b9d0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
b9e0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
b9f0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
ba00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
ba10: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
ba20: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
ba30: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
ba40: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
ba50: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
ba60: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
ba70: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
ba80: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
ba90: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
baa0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
bab0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
bac0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
bad0: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
bae0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
baf0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
bb00: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
bb10: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
bb20: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
bb30: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
bb40: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
bb50: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
bb60: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
bb70: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
bb80: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
bb90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
bba0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
bbb0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
bbc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
bbd0: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
bbe0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
bbf0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
bc00: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
bc10: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
bc20: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
bc30: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
bc40: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
bc50: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
bc60: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
bc70: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
bc80: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
bc90: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
bca0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
bcb0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
bcc0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
bcf0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
bd00: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
bd10: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
bd20: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
bd30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
bd40: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
bd50: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
bd60: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
bd70: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
bd80: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
bd90: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
bda0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
bdb0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
bdc0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
bdd0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
bde0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
bdf0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
be00: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
be10: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
be20: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
be30: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
be40: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
be50: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
be60: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
be70: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
be80: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
be90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
bea0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
beb0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
bec0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
bed0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
bee0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
bef0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
bf00: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
bf10: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
bf20: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
bf30: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
bf40: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
bf50: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
bf60: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
bf70: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
bf80: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
bf90: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
bfa0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
bfb0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
bfc0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
bfd0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
bfe0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
bff0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
c000: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
c010: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
c020: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
c030: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
c040: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
c050: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
c060: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
c070: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
c080: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
c090: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
c0a0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c0b0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
c0c0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
c0d0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c0e0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
c0f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
c100: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
c110: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
c120: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
c130: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
c140: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
c150: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
c160: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
c170: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
c180: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
c190: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
c1a0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
c1b0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
c1c0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
c1d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
c1e0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
c1f0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
c200: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
c210: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
c220: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
c230: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
c240: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
c250: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
c260: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
c270: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
c280: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
c290: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
c2a0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
c2b0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
c2c0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
c2d0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
c2e0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
c2f0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
c300: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
c310: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
c320: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
c330: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
c340: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
c350: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
c360: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
c370: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c380: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
c390: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
c3a0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
c3b0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
c3c0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
c3d0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
c3e0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
c3f0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
c400: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
c410: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
c420: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
c430: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
c440: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
c450: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
c460: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c470: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
c480: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
c490: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
c4a0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
c4b0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
c4c0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
c4d0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
c4e0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
c4f0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
c500: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
c510: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
c520: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
c530: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
c540: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
c550: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c560: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c570: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
c580: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c590: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
c5a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
c5b0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
c5c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
c5d0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
c5e0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
c5f0: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
c600: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
c610: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61  File->h,.      a
c620: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
c630: 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
c640: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
c650: 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  k),.      azFile
c660: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  Lock(pFile->pIno
c670: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
c680: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
c690: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
c6a0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
c6b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
c6c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
c6d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
c6e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
c6f0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
c700: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
c710: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
c720: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
c730: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
c740: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
c750: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
c760: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
c770: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
c780: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
c790: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
c7a0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
c7b0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
c7c0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
c7d0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
c7e0: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
c7f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c800: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
c810: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
c820: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
c830: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
c840: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
c850: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
c860: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
c870: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
c880: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
c890: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
c8a0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
c8b0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
c8c0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
c8d0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
c8e0: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
c8f0: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
c900: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
c910: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c920: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
c930: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
c940: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
c950: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
c960: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
c970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
c980: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
c990: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
c9a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c9b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
c9c0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
c9d0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
c9e0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
c9f0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
ca00: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
ca10: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ca20: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ca30: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
ca40: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
ca50: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
ca60: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
ca70: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
ca80: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
ca90: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
caa0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
cab0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
cac0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
cad0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
cae0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
caf0: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
cb00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
cb10: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
cb20: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
cb30: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
cb40: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
cb50: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
cb60: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
cb70: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
cb80: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
cb90: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
cba0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
cbb0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
cbc0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
cbd0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
cbe0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
cbf0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
cc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cc10: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
cc20: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cc30: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
cc40: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
cc50: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
cc60: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
cc70: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cc80: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
cc90: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
cca0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
ccb0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ccc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
ccd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
cce0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
ccf0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
cd00: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
cd10: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cd20: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
cd30: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
cd40: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
cd50: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
cd60: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
cd70: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
cd80: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
cd90: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
cda0: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
cdb0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
cdc0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
cdd0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
cde0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
cdf0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
ce00: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
ce10: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
ce20: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ce30: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
ce40: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
ce50: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
ce60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
ce70: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
ce80: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
ce90: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
cea0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
ceb0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
cec0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
ced0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
cee0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
cef0: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
cf00: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
cf10: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
cf20: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
cf30: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
cf40: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
cf50: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
cf60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
cf70: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
cf80: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
cf90: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
cfa0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
cfb0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
cfc0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
cfd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
cfe0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
cff0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
d000: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
d010: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
d020: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
d030: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
d040: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
d050: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
d060: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d070: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
d080: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
d090: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
d0a0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d0b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
d0c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
d0d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
d0e0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
d0f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
d100: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d110: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
d120: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d130: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
d140: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d150: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d160: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d170: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d180: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d190: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d1a0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d1b0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
d1c0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
d1d0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
d1e0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
d1f0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
d200: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
d210: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
d220: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
d230: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
d240: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d250: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
d260: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
d270: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
d280: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
d290: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
d2a0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
d2b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d2c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
d2d0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
d2e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
d2f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
d300: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
d310: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d320: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d340: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d360: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d370: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
d380: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
d390: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
d3a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
d3c0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
d3d0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
d3e0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
d3f0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
d400: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
d410: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
d420: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
d430: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
d440: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
d450: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
d460: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
d470: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
d480: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
d490: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
d4a0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
d4b0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
d4c0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
d4d0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
d4e0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
d4f0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
d500: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
d510: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
d520: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
d530: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
d540: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
d550: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d560: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
d570: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
d580: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
d590: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
d5a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
d5b0: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
d5c0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
d5d0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
d5e0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
d5f0: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
d600: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
d610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
d620: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
d630: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
d640: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
d650: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
d660: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
d670: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d680: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d690: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d6a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d6b0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d6c0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d6d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d6e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d6f0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
d700: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d710: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d720: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d730: 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
d740: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
d750: 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
d760: 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
d770: 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
d780: 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
d790: 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
d7a0: 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
d7b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
d7c0: 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
d7d0: 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
d7e0: 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
d7f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
d800: 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
d810: 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
d820: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
d830: 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
d840: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d850: 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
d860: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
d870: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
d880: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
d890: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
d8a0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
d8b0: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
d8c0: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
d8d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
d8e0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
d8f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
d900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d910: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
d920: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
d930: 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
d940: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
d950: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
d960: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d970: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
d980: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
d990: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
d9a0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
d9b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
d9c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
d9d0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
d9e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
d9f0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
da00: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
da10: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
da20: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
da30: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
da40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
da50: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
da60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
da70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
da80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
da90: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
daa0: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
dab0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
dac0: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
dad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dae0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
daf0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
db00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
db10: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
db20: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
db30: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
db40: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
db50: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
db60: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
db70: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
db80: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
db90: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
dba0: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
dbb0: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
dbc0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
dbd0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
dbe0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
dbf0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
dc00: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
dc10: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
dc20: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
dc30: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
dc40: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
dc50: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
dc60: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
dc70: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
dc80: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
dc90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
dca0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
dcb0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dcc0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
dcd0: 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
dce0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
dcf0: 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
dd00: 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
dd10: 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
dd20: 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
dd30: 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
dd40: 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
dd50: 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
dd60: 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
dd70: 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
dd80: 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
dd90: 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
dda0: 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
ddb0: 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
ddc0: 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
ddd0: 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
dde0: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
ddf0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
de00: 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
de10: 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
de20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
de30: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
de40: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
de50: 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e  ileLock, int han
de60: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
de70: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
de80: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
de90: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
dea0: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
deb0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
dec0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ded0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
dee0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
def0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
df00: 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
df10: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
df20: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
df30: 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70  ileLock,.      p
df40: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
df50: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
df60: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
df70: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
df80: 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28  d,.      getpid(
df90: 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
dfa0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
dfb0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
dfc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
dfd0: 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
dfe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dff0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
e000: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
e010: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
e020: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
e030: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
e050: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
e060: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
e070: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
e080: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
e090: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
e0a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
e0b0: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
e0c0: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
e0d0: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
e0e0: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
e0f0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
e100: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
e110: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
e120: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
e130: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
e140: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
e150: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
e160: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
e170: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
e180: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
e190: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
e1a0: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
e1b0: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
e1c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
e1d0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
e1e0: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
e1f0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
e200: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
e210: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
e220: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
e230: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
e240: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
e250: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
e260: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
e270: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
e280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
e290: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
e2a0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
e2b0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
e2c0: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
e2d0: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
e2e0: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
e2f0: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
e300: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
e310: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
e320: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
e330: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
e340: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
e350: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
e360: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
e370: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
e380: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
e390: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
e3a0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
e3b0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
e3c0: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
e3d0: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
e3e0: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
e3f0: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
e400: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
e410: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
e420: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
e430: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
e440: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
e450: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
e460: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
e470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
e480: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
e490: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
e4a0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
e4b0: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
e4c0: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
e4d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
e4e0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
e4f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
e500: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
e510: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
e520: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
e530: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
e540: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
e550: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
e560: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
e570: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
e580: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
e590: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
e5a0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
e5b0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
e5c0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e5d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
e5e0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
e5f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
e600: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
e610: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
e620: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
e630: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e640: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
e650: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
e660: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e670: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e680: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e690: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
e6a0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e6b0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e6c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e6d0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e6e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e6f0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e700: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e710: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e720: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
e730: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e740: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e750: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e760: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e770: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
e780: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
e790: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
e7a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e7b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
e7d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e7e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e7f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
e800: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
e810: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
e820: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
e830: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e840: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e850: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e860: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e870: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e880: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e890: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e8a0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
e8b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
e8c0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
e8d0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e8e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e8f0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e900: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
e910: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e920: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
e930: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e940: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e950: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e960: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e970: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e980: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e990: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e9a0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
e9b0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
e9c0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
e9d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e9e0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e9f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ea00: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ea10: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ea20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
ea30: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
ea40: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
ea50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
ea60: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
ea70: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
ea80: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
ea90: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
eaa0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
eab0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
eac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ead0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
eae0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
eaf0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
eb00: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
eb10: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
eb20: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
eb30: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
eb40: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
eb50: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
eb60: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
eb70: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
eb80: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
eb90: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
eba0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
ebb0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
ebc0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
ebd0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
ebe0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
ebf0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
ec00: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
ec10: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
ec20: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
ec30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ec40: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
ec50: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
ec60: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
ec70: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
ec80: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
ec90: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
eca0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
ecb0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
ecc0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
ecd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ece0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
ecf0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ed00: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
ed10: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ed20: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ed40: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
ed50: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ed60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ed70: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
ed80: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ed90: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
eda0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
edb0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
edc0: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
edd0: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
ede0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
edf0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ee00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
ee10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
ee20: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
ee30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
ee40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ee50: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
ee60: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ee70: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
ee80: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
ee90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
eea0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
eeb0: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
eec0: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
eed0: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
eee0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
eef0: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
ef00: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
ef10: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
ef20: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
ef30: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
ef40: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
ef50: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
ef60: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
ef70: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
ef80: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
ef90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
efa0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
efb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
efc0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
efd0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
efe0: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
eff0: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
f000: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f010: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
f020: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f030: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f040: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
f050: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f060: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f070: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
f080: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
f090: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f  no;.        pIno
f0a0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f0b0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
f0c0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f0d0: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
f0e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f0f0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f100: 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
f110: 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
f120: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
f130: 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
f140: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
f150: 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
f160: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
f170: 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
f180: 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
f190: 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
f1a0: 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
f1b0: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
f1c0: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
f1d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
f1e0: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
f1f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
f200: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   ){.      closeP
f210: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
f220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
f230: 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
f240: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
f250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f260: 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
f270: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
f280: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f290: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
f2a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
f2b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
f2c0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
f2d0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
f2e0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
f2f0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
f300: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
f310: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
f320: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
f330: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
f340: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
f350: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
f360: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
f370: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
f380: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
f3a0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
f3b0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
f3c0: 65 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65 72 74  eLock){.  assert
f3d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
f3e0: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e  RED_LOCK || ((un
f3f0: 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46  ixFile *)id)->nF
f400: 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
f410: 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
f420: 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
f430: 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  , 0);.}..static 
f440: 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
f450: 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
f460: 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69  64 nByte);.stati
f470: 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
f480: 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
f490: 46 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  Fd);../*.** This
f4a0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
f4b0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
f4c0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
f4d0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
f4e0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
f4f0: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
f500: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
f510: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
f520: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
f530: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
f540: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
f550: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
f560: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
f570: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
f580: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
f590: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
f5a0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
f5b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
f5c0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
f5d0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
f5e0: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
f5f0: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
f600: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
f610: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
f620: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f630: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
f640: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f650: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f660: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f670: 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6d 61 70  )id;.  unixUnmap
f680: 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  file(pFile);.  i
f690: 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
f6a0: 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
f6b0: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
f6c0: 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
f6d0: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
f6e0: 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
f6f0: 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
f700: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
f710: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
f720: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
f730: 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
f740: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
f750: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
f760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
f770: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
f780: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
f790: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
f7a0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f7b0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
f7c0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
f7d0: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
f7e0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
f7f0: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
f800: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
f810: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
f820: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
f830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f840: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
f850: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
f860: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
f870: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f880: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
f890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
f8a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f8b0: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
f8c0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
f8d0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
f8e0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
f8f0: 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
f900: 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
f910: 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
f920: 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
f930: 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
f940: 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
f950: 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
f960: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
f970: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
f980: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
f990: 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
f9a0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
f9b0: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
f9c0: 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
f9d0: 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
f9e0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
f9f0: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
fa00: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
fa10: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
fa20: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
fa30: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
fa40: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
fa50: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
fa60: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
fa70: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
fa80: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
fa90: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
faa0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
fab0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
fac0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
fad0: 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
fae0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
faf0: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
fb00: 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
fb10: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
fb20: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
fb30: 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
fb40: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
fb50: 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
fb60: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
fb70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
fb80: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
fb90: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
fba0: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
fbb0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
fbc0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
fbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc10: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
fc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
fc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc80: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
fc90: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
fca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
fcc0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
fcd0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
fce0: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
fcf0: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
fd00: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
fd10: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
fd20: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
fd30: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
fd40: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
fd50: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
fd60: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
fd70: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
fd80: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
fd90: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
fda0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
fdb0: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
fdc0: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
fdd0: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
fde0: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
fdf0: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
fe00: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
fe10: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
fe20: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
fe30: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
fe40: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
fe50: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
fe60: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
fe70: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
fe80: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
fe90: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
fea0: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
feb0: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
fec0: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
fed0: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
fee0: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
fef0: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
ff00: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
ff10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ff20: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
ff30: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
ff40: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
ff50: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
ff60: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
ff70: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
ff80: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
ff90: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
ffa0: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
ffb0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
ffc0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
ffd0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
ffe0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
fff0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
10000 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
10010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10020 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10030 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
10040 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
10050 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
10060 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
10070 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10080 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
10090 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
100a0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
100b0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
100c0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
100d0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
100e0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
100f0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
10100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10110 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
10120 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
10130 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10140 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
10150 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
10160 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
10170 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
10180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
10190 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
101a0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
101b0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
101c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
101d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10210 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
10290 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
102c0 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
102d0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
102e0 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
102f0 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
10300 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
10310 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63   (really a direc
10320 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c  tory) to control
10330 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
10340 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
10350 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20  orks.** on just 
10360 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
10370 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
10380 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
10390 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
103a0 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
103b0 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
103c0 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
103d0 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
103e0 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
103f0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
10400 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
10410 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
10420 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
10430 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
10440 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
10450 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
10460 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
10470 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
10480 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
10490 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
104a0 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
104b0 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
104c0 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
104d0 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
104e0 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
104f0 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
10500 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
10510 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
10520 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
10530 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
10540 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
10550 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20 69  a subdirectory i
10560 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
10570 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64  tory as.** the d
10580 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
10590 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
105a0 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
105b0 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
105c0 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
105d0 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69  nce of a lock di
105e0 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20  rectory implies 
105f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
10600 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a  k.  All other.**
10610 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41   lock types (SHA
10620 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50  RED, RESERVED, P
10630 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70  ENDING) are mapp
10640 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56  ed into EXCLUSIV
10650 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  E..*/../*.** The
10660 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64   file suffix add
10670 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62  ed to the data b
10680 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  ase filename in 
10690 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
106a0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65  the.** lock dire
106b0 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ctory..*/.#defin
106c0 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
106d0 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20   ".lock"../*.** 
106e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
106f0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
10700 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
10710 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
10720 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
10730 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
10740 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
10750 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
10760 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
10770 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
10780 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
10790 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
107a0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
107b0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
107c0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
107d0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
107e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
107f0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
10800 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f  ing..**.** In do
10810 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65  tfile locking, e
10820 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69  ither a lock exi
10830 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e  sts or it does n
10840 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a  ot.  So in this.
10850 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20  ** variation of 
10860 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10870 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73  k(), *pResOut is
10880 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
10890 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68  any lock.** is h
108a0 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  eld on the file 
108b0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
108c0 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
108d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
108e0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
108f0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10900 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
10910 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
10920 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10930 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
10940 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
10950 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10960 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
10970 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
10980 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10990 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
109a0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
109b0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
109c0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
109d0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
109e0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
109f0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
10a00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10a10 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
10a20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
10a30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
10a40 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
10a50 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
10a60 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
10a70 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
10a80 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
10a90 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
10aa0 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
10ab0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
10ac0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
10ad0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
10ae0 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
10af0 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
10b00 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
10b10 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
10b20 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
10b30 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10b40 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
10b50 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b  = osAccess(zLock
10b60 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d  File, 0)==0;.  }
10b70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
10b80 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
10b90 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
10ba0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
10bb0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
10bc0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
10bd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10be0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
10bf0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
10c00 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
10c10 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
10c20 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
10c30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10c40 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10c50 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10c60 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10c70 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10c80 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10c90 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10ca0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10cb0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10cc0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10cd0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10ce0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10cf0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10d00 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10d10 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10d20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10d30 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10d40 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10d50 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10d60 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10d70 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10d80 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10d90 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
10da0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
10db0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
10dc0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
10dd0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10de0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
10df0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
10e00 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
10e10 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
10e20 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
10e30 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
10e40 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
10e50 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
10e60 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
10e70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
10e80 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
10e90 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
10ea0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
10eb0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
10ec0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
10ed0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
10ee0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
10ef0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
10f00 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
10f10 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
10f20 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
10f30 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
10f40 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
10f50 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
10f60 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
10f70 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
10f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
10f90 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
10fa0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10fb0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
10fc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10fd0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10fe0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
10ff0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11000 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11010 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  xt;.  int rc = S
11020 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
11030 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   If we have any 
11040 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c  lock, then the l
11050 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
11060 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65   exists.  All we
11070 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11080 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69   is adjust our i
11090 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
110a0 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c  f the lock level
110b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
110c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
110d0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
110e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
110f0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
11100 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
11110 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
11120 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
11130 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  */.#ifdef HAVE_U
11140 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a  TIME.    utime(z
11150 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11160 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65  .#else.    utime
11170 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
11180 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
11190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
111b0 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
111c0 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73  ock */.  rc = os
111d0 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c  Mkdir(zLockFile,
111e0 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63   0777);.  if( rc
111f0 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69  <0 ){.    /* fai
11200 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
11210 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65  te the lock dire
11220 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74  ctory */.    int
11230 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11240 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
11250 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
11260 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
11270 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
11280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11290 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
112a0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
112b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
112c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
112d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
112e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
112f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11300 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
11310 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
11320 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
11330 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
11340 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
11350 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
11360 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11370 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
11380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11390 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
113a0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
113b0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
113c0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
113d0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
113e0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
113f0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
11400 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
11410 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
11420 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11430 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11440 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11450 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11460 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11470 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11480 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
11490 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
114a0 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
114b0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
114c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
114d0 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
114e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
114f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11500 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11510 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11520 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
11530 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
11540 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
11550 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
11560 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
11570 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
11580 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
11590 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
115a0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
115b0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
115c0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
115d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
115e0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
115f0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
11600 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
11610 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
11620 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
11630 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11640 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
11650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11660 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11670 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
11680 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
11690 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
116a0 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
116b0 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
116c0 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
116d0 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
116e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
116f0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
11700 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
11710 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
11720 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
11730 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
11740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11750 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
11760 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
11770 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
11780 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
11790 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
117a0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72  ==NO_LOCK );.  r
117b0 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63  c = osRmdir(zLoc
117c0 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  kFile);.  if( rc
117d0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
117e0 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e  TDIR ) rc = osUn
117f0 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  link(zLockFile);
11800 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
11810 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11820 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
11830 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  0;.    if( ENOEN
11840 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
11850 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11860 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
11870 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
11880 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11890 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
118a0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
118b0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
118c0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
118d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
118e0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
118f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11900 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
11910 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
11920 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
11930 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
11940 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
11950 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
11960 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
11970 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
11980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11990 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
119a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
119b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
119c0 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
119d0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
119e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
119f0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
11a00 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
11a10 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
11a20 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
11a30 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
11a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
11a50 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
11a60 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
11a70 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
11a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ad0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
11ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
11b50 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
11b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
11b80 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
11b90 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
11ba0 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
11bb0 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
11bc0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
11bd0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
11be0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
11bf0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
11c00 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
11c10 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
11c20 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
11c30 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
11c40 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
11c50 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
11c60 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
11c70 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
11c80 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
11c90 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
11ca0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
11cb0 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
11cc0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
11cd0 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
11ce0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
11cf0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
11d00 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
11d10 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
11d20 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
11d30 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
11d40 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
11d50 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
11d60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11d70 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
11d80 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
11d90 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
11da0 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
11db0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
11dc0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
11dd0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
11de0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
11df0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
11e00 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
11e10 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
11e20 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
11e30 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
11e40 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
11e50 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
11e60 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
11e70 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
11e80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11e90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11ea0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
11eb0 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
11ec0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
11ed0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
11ee0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
11ef0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
11f00 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
11f10 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
11f20 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
11f30 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
11f40 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
11f50 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
11f60 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
11f70 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
11f80 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
11f90 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
11fa0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
11fb0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
11fc0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
11fd0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
11fe0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
11ff0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
12000 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
12010 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12020 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12030 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
12040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12050 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
12060 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
12070 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12080 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
12090 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
120a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
120b0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
120c0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
120d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
120e0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
120f0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12100 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12110 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12120 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12130 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12140 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12150 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12160 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12170 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
12180 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
12190 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
121a0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
121b0 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
121c0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
121d0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
121e0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
121f0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
12200 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
12210 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
12220 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
12230 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
12240 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
12250 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
12260 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
12270 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
12280 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12290 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
122a0 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
122b0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
122c0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
122d0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
122e0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
122f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12300 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
12310 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12320 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
12330 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12350 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
12360 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12370 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
12380 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
12390 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
123a0 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
123b0 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
123c0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
123d0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
123e0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
123f0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
12400 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12410 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
12420 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12430 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
12440 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
12450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12460 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
12470 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
12480 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
12490 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
124a0 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
124b0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
124c0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
124d0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
124e0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
124f0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12510 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
12520 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
12530 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12540 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12550 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
12560 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
12570 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12580 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
12590 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
125a0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
125b0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
125c0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
125d0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
125e0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
125f0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12600 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12610 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
12620 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
12630 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
12640 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
12650 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
12660 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
12670 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
12680 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
12690 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
126a0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
126b0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
126c0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
126d0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
126e0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
126f0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
12700 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
12710 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
12720 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
12730 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
12740 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
12750 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
12760 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
12770 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
12780 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
12790 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
127a0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
127b0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
127c0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
127d0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
127e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
127f0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
12800 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12810 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
12820 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
12830 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
12840 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
12850 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
12860 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
12870 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
12880 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
12890 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
128a0 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
128b0 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
128c0 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
128d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
128e0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
128f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
12900 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
12910 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
12920 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
12930 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
12940 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
12950 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
12960 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
12970 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
12980 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
12990 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
129a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
129b0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
129c0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
129d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
129e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
129f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
12a00 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12a10 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
12a20 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
12a30 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
12a40 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
12a50 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
12a60 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
12a70 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
12a80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
12a90 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
12aa0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12ab0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
12ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ad0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
12ae0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
12af0 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
12b00 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
12b10 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
12b20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
12b30 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12b40 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
12b50 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
12b60 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
12b70 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12b80 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12b90 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12ba0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
12bb0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12bc0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
12bd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12be0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
12bf0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
12c00 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
12c10 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
12c20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
12c30 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
12c40 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
12c50 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
12c60 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
12c70 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
12c80 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
12c90 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
12ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
12cb0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
12cc0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
12cd0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
12ce0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
12cf0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
12d00 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
12d10 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
12d20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
12d30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12d40 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12d50 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12d70 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
12d80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
12d90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12da0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
12db0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
12dc0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
12dd0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
12de0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
12df0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
12e00 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
12e10 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
12e20 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
12e30 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
12e40 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
12e50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
12e60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
12e70 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
12e80 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12e90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12ea0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
12eb0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12ec0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
12ed0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12ee0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
12ef0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
12f00 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
12f10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
12f20 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
12f30 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
12f40 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
12f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
12f60 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
12f70 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
12f80 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
12f90 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12fa0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
12fb0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
12fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12fd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
12fe0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
12ff0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
13000 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
13010 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
13020 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
13030 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
13040 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13050 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
13060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13070 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
13080 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
13090 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
130a0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
130b0 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
130c0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
130d0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
130e0 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
130f0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
13100 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
13110 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13120 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
13130 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
13140 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
13150 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13160 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13180 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
13190 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
131a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
131b0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
131c0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
131d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
131e0 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
131f0 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28      flockUnlock(
13200 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
13210 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
13220 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
13230 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
13240 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13250 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13260 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13270 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13290 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
132a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
132b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
132d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
13320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13360 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13380 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13390 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
133a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
133c0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
133d0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
133e0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
133f0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
13400 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
13410 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
13420 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13430 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13440 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13450 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13460 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13470 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13480 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13490 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
134a0 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
134b0 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
134c0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
134d0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
134e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
134f0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
13500 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
13510 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13520 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13530 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13540 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13550 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13560 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13570 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13580 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13590 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
135a0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
135b0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
135c0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
135d0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
135e0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
135f0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13600 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13610 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
13620 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
13630 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
13640 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
13650 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
13660 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13670 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
13680 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13690 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
136a0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
136b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
136c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
136d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
136e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
136f0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
13700 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
13710 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13720 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
13730 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
13740 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
13750 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
13760 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
13770 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
13780 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
13790 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
137a0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
137b0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
137c0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
137d0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
137e0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
137f0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
13800 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
13810 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
13820 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
13830 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
13840 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
13850 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13860 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
13870 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
13880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13890 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
138a0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
138b0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
138c0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
138d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
138e0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
138f0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
13900 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
13910 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
13920 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
13930 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
13940 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
13950 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
13960 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
13970 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
13980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13990 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
139a0 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
139b0 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
139c0 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
139d0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
139e0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
139f0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
13a00 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
13a10 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
13a20 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
13a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13a40 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
13a50 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
13a60 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
13a70 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
13a80 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
13a90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
13aa0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
13ab0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
13ac0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
13ad0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
13ae0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
13af0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
13b00 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
13b10 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13b20 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13b30 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13b40 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13b50 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13b60 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13b70 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13b80 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
13b90 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
13ba0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
13bb0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
13bc0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
13bd0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
13be0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
13bf0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
13c00 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
13c10 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13c20 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13c30 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13c40 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13c50 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13c60 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13c70 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13c80 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13c90 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13ca0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13cb0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
13cc0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13cd0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
13ce0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
13cf0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
13d00 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
13d10 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
13d20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
13d30 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
13d40 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13d50 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13d60 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13d70 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13d80 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13d90 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13da0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13db0 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
13dc0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
13dd0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
13de0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
13df0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13e00 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
13e10 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
13e20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
13e30 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
13e40 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13e50 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13e60 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13e70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13e80 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13e90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13ea0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13eb0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
13ec0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
13ed0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
13ee0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ef0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
13f00 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
13f10 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
13f20 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
13f30 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
13f40 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13f50 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13f60 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13f70 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13f80 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13f90 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13fa0 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13fb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
13fc0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13fd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
13fe0 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
13ff0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
14000 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
14010 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
14020 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
14030 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14040 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
14050 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
14060 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
14070 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
14080 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
14090 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
140a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
140b0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
140c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
140d0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
140e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
140f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14100 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
14110 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
14120 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
14130 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
14140 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
14150 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
14160 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
14170 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
14180 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
14190 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
141a0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
141b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
141c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
141d0 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
141e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
141f0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14200 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14210 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14220 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14230 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14240 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14250 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
14270 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14280 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14290 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
142a0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
142b0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
142c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
142d0 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
142e0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
142f0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
14300 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
14310 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
14320 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
14330 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
14340 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
14350 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14360 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
14370 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
14380 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
14390 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
143a0 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
143b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
143c0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
143d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
143e0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
143f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14400 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
14410 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
14420 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
14430 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
14440 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
14450 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
14470 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14480 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14490 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
144a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
144b0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
144c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
144d0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
144e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
144f0 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
14500 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
14510 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
14520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
14530 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
14540 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
14550 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  semClose(sqlite3
14560 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
14570 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
14580 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14590 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
145a0 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20    semUnlock(id, 
145b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
145c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
145d0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
145e0 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
145f0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
14600 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
14610 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
14620 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
14630 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14640 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
14650 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
14660 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
14670 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
14680 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
14690 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
146a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
146b0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
146c0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
146d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
146e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14740 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
14750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14790 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
147a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
147b0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
147c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
147d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147e0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
147f0 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
14800 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
14810 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
14820 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
14830 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
14840 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
14850 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
14860 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
14870 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
14880 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
14890 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
148a0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
148b0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
148c0 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
148d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
148e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
148f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
14900 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
14910 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
14920 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
14930 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
14940 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
14950 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
14960 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
14970 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
14980 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
14990 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
149a0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
149b0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
149e0 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
149f0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
14a00 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
14a10 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
14a20 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
14a30 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
14a40 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
14a50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
14a60 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
14a70 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
14a80 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
14a90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14aa0 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
14ab0 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
14ac0 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
14ad0 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
14ae0 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
14af0 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
14b00 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
14b10 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
14b20 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
14b30 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
14b40 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
14b50 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
14b60 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
14b70 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b90 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
14ba0 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
14bb0 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
14bc0 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
14bd0 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
14be0 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
14bf0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
14c00 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
14c10 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
14c20 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
14c30 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
14c40 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
14c50 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
14c60 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
14c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
14c80 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
14c90 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
14ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14cb0 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
14cc0 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14ce0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
14cf0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
14d00 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
14d10 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d30 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
14d40 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
14d50 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14d60 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
14d70 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
14d80 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
14d90 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
14da0 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
14db0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
14dc0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
14dd0 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14df0 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
14e00 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
14e10 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
14e20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
14e30 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
14e40 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
14e50 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
14e60 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
14e70 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
14e80 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
14e90 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
14ea0 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
14eb0 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
14ec0 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
14ed0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
14ee0 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
14ef0 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
14f00 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
14f10 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
14f20 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
14f30 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
14f40 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
14f50 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
14f60 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
14f70 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
14f80 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
14f90 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
14fa0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
14fb0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14fc0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
14fd0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
14fe0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
14ff0 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
15000 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
15010 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
15020 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
15030 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
15040 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
15050 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15060 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
15070 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
15080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
15090 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
150a0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
150c0 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
150d0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
150e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
150f0 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
15100 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15110 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
15120 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15130 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15140 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15150 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
15160 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15170 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
15180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15190 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
151a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
151b0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
151c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
151d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
151e0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
151f0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15200 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15210 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15220 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
15230 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
15240 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
15250 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
15260 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
15270 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
15280 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15290 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
152a0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
152b0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
152c0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
152d0 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
152e0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
152f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
15300 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
15310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15320 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
15330 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
15340 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15350 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
15360 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
15370 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  ext;.  .  Simula
15380 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
15390 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
153a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
153b0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
153c0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e  ( pFile );.  con
153d0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
153e0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
153f0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15400 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
15410 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
15420 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
15430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15440 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
15450 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
15460 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
15470 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
15480 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
15490 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
154a0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
154b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
154c0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
154d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
154e0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
154f0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
15500 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
15510 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
15520 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
15530 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15540 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
15550 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
15560 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
15570 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
15580 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
15590 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
155a0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
155b0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
155c0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
155d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
155e0 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
155f0 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
15600 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
15610 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
15620 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
15630 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
15640 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
15650 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
15660 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15670 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15680 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15690 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
156a0 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
156b0 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
156c0 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
156d0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
156e0 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
156f0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
15700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
15710 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
15720 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
15730 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
15740 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
15750 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
15760 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
15770 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
15780 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
15790 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
157a0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
157b0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
157c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
157d0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
157e0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
157f0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
15800 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
15810 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15820 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
15830 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
15840 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
15850 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
15860 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
15870 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
15880 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
15890 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
158a0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
158b0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
158c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
158d0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
158e0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
158f0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
15900 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
15910 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
15920 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
15930 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
15940 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
15950 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
15960 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
15970 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
15980 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
15990 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
159a0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
159b0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
159c0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
159d0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
159e0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
159f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
15a00 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
15a10 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
15a20 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
15a30 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
15a40 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
15a50 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
15a60 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
15a70 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
15a80 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
15a90 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
15aa0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
15ab0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
15ac0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
15ad0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
15ae0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
15af0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
15b00 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15b10 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
15b20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15b30 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
15b40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15b50 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
15b60 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
15b70 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
15b80 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15b90 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
15ba0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15bb0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
15bc0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
15bd0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15be0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
15bf0 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
15c00 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
15c10 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
15c20 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
15c30 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15c40 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
15c50 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
15c60 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
15c70 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
15c80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
15c90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
15ca0 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
15cb0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
15cc0 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
15cd0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
15ce0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
15cf0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
15d00 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
15d10 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
15d20 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
15d30 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
15d40 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
15d50 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
15d60 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
15d70 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
15d80 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
15d90 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
15da0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
15db0 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
15dc0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
15dd0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
15de0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15df0 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
15e00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15e10 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
15e20 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
15e30 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
15e40 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
15e50 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
15e60 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
15e70 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
15e80 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
15e90 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
15ea0 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
15eb0 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
15ec0 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
15ed0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
15ee0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
15ef0 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
15f00 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
15f10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15f20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
15f30 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
15f40 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15f50 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15f60 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
15f70 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
15f80 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
15f90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
15fa0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15fb0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15fc0 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
15fd0 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
15fe0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15ff0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16000 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
16010 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
16020 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16030 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16040 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
16050 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
16060 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
16070 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
16080 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
16090 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
160a0 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
160b0 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
160c0 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
160d0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
160e0 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
160f0 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
16100 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16110 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
16120 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
16130 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
16140 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
16150 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
16160 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16170 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
16180 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
16190 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
161a0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
161b0 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
161c0 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
161d0 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
161e0 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
161f0 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
16200 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
16210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16220 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
16230 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16240 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
16250 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16260 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16270 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16280 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
16290 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
162a0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
162b0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
162c0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
162d0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
162e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
162f0 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
16300 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16310 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16320 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
16330 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
16340 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
16350 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16360 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
16370 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
16380 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
16390 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
163a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
163b0 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
163c0 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
163d0 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
163e0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
163f0 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
16400 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
16410 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
16420 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16430 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
16440 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
16450 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
16460 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
16470 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
16480 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
16490 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
164a0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
164b0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
164c0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
164d0 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
164e0 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
164f0 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
16500 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16510 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
16520 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
16530 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
16540 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
16550 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
16560 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
16570 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
16580 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
16590 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
165a0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
165b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
165c0 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
165d0 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
165e0 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
165f0 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
16600 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16610 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
16620 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
16630 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16640 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
16650 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
16660 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
16670 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
16680 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
16690 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
166a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
166b0 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
166c0 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
166d0 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
166e0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
166f0 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
16700 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
16710 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
16720 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
16730 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
16740 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
16750 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16760 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16770 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
16780 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16790 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
167a0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
167b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
167c0 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
167d0 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
167e0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
167f0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
16800 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
16810 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
16820 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
16830 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16840 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
16850 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16860 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
16870 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
16880 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
16890 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45  astErrno = lrc1E
168a0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
168b0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
168c0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
168d0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
168e0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
168f0 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
16900 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
16910 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16920 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
16930 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
16940 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
16950 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
16960 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
16970 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
16980 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
16990 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
169a0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
169b0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
169c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
169d0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
169e0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
169f0 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
16a00 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
16a10 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
16a20 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
16a30 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
16a40 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
16a50 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
16a60 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
16a70 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
16a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16a90 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
16aa0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
16ab0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
16ac0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
16ad0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
16ae0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
16af0 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
16b00 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
16b10 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
16b20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
16b30 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
16b40 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
16b50 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
16b60 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
16b70 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
16b80 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
16b90 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
16ba0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
16bb0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
16bc0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
16bd0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
16be0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
16bf0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16c00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16c10 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
16c20 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
16c30 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
16c40 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
16c50 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
16c60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
16c70 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
16c80 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
16c90 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
16ca0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
16cb0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
16cc0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
16cd0 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
16ce0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
16cf0 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
16d00 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
16d10 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
16d20 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
16d30 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
16d40 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
16d50 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
16d60 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
16d70 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16d80 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16d90 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16da0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
16dc0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16dd0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
16de0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
16df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16e00 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
16e10 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
16e20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
16e30 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
16e40 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16e50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16e60 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16e70 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16ea0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
16eb0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
16ec0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
16ed0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16ee0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
16f10 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
16f20 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
16f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16f40 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
16f50 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
16f60 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
16f70 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
16f80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
16f90 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
16fa0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
16fb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
16fc0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
16fd0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
16fe0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
16ff0 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17000 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17010 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
17020 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17030 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
17040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17050 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17060 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
17070 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17090 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
170a0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
170b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
170c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
170d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
170e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
170f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17100 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17110 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17120 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
17130 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17140 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17150 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17160 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17170 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
17180 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
17190 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
171a0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
171b0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
171c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
171d0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
171e0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
171f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
17200 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
17210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17220 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
17230 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
17240 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17250 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
17260 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
17270 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17280 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17290 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
172a0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
172b0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
172c0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
172d0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
172e0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
172f0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17300 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17310 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17320 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
17330 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17340 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17350 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
17360 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17370 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17380 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17390 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
173a0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
173b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
173c0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
173d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
173e0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
173f0 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
17400 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
17410 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17420 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
17430 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17440 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17450 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17460 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
17470 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17480 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17490 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
174a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
174b0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
174c0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
174d0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
174e0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
174f0 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
17500 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
17510 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
17520 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
17530 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
17540 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
17550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17560 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
17570 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
17580 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
17590 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
175a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
175b0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
175c0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
175d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
175e0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
175f0 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
17600 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
17610 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17620 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
17630 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
17640 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
17650 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17660 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65  n(0);.    .#ifde
17670 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
17680 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
17690 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
176a0 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
176b0 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
176c0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
176d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
176e0 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
176f0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
17700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17710 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
17720 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
17730 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
17740 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
17750 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
17760 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
17770 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
17780 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
17790 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
177a0 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
177b0 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
177c0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
177d0 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
177e0 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
177f0 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
17800 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
17810 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
17820 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
17830 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
17840 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
17850 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
17860 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
17870 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ite==0.         
17880 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70    || pFile->dbUp
17890 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  date==0.        
178a0 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
178b0 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
178c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
178d0 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
178e0 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69  endif.    .    i
178f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17900 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17910 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
17920 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17930 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17940 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
17950 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  T, SHARED_SIZE, 
17960 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
17970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
17980 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17990 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
179a0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a  ->nShared>1) ){.
179b0 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20          /* only 
179c0 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65  re-establish the
179d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
179e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
179f0 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c       int sharedL
17a00 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
17a10 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
17a20 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20  haredByte;.     
17a30 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17a40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17a50 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
17a60 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
17a70 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
17a80 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61  .        skipSha
17a90 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  red = 1;.      }
17aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
17ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17ac0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ad0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
17ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
17af0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17b00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17b10 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
17b20 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20   0);.    } .    
17b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17b40 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17b50 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
17b60 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d  LOCK && context-
17b70 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
17b80 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17b90 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17ba0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17bb0 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
17bc0 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
17bd0 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  { .        conte
17be0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  xt->reserved = 0
17bf0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
17c00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c10 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
17c20 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17c30 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
17c40 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20  ared>1)){.      
17c50 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17c60 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
17c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
17c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17c90 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  & eFileLock==NO_
17ca0 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  LOCK ){..    /* 
17cb0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
17cc0 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
17cd0 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
17ce0 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
17cf0 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
17d00 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
17d10 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
17d20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
17d30 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
17d40 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
17d50 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
17d60 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42  long sharedLockB
17d70 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
17d80 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
17d90 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64  dByte;.    pInod
17da0 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
17db0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
17dc0 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
17dd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17de0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
17df0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17e00 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
17e10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17e20 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
17e30 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65    if( !skipShare
17e40 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
17e50 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17e60 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17e70 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
17e80 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  yte, 1, 0);.    
17e90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72    }.      if( !r
17ea0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  c ){.        pIn
17eb0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17ec0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
17ed0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17ee0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
17ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17f10 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  K ){.      pInod
17f20 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
17f30 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17f40 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
17f50 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
17f60 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
17f70 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
17f80 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
17f90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
17fa0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
17fb0 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
17fc0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
17fd0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17fe0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
17ff0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
18000 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c  lose a file & cl
18010 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66  eanup AFP specif
18020 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  ic locking conte
18030 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xt .*/.static in
18040 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74  t afpClose(sqlit
18050 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
18060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18070 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
18080 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
18090 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
180a0 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c  *)id;.    afpUnl
180b0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
180c0 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
180d0 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
180e0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
180f0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18100 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
18110 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
18120 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
18130 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
18140 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
18150 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
18160 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
18170 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
18180 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
18190 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
181a0 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
181b0 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
181c0 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
181d0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
181e0 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
181f0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
18200 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
18210 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18220 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
18230 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
18240 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
18250 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c  (pFile);.    sql
18260 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
18270 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
18280 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
18290 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
182a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
182b0 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
182c0 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
182d0 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
182e0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
182f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18300 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
18310 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
18320 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
18330 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18340 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18350 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18360 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18370 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18380 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18390 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
183a0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
183b0 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
183c0 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
183d0 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
183e0 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
183f0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
18400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18410 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
18420 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18430 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
18440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
184a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
184f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18500 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
18510 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
18520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
18540 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18550 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18560 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18570 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18580 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18590 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
185a0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
185b0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
185c0 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
185d0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
185e0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
185f0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18600 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18610 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18620 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18630 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
18640 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18650 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18660 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18670 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
18680 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
18690 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
186a0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
186b0 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
186c0 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
186d0 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
186e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
186f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18700 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18710 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18720 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18730 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
18740 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18750 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18760 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18770 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18780 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18790 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
187a0 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
187b0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
187c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
187d0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
187e0 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
187f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18810 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18860 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
18870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
188c0 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
188d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
188e0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
18910 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
18920 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
18930 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
18940 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
18950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
18960 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
18970 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
18980 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
18990 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
189a0 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
189b0 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
189c0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
189d0 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
189e0 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
189f0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
18a00 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
18a10 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
18a20 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
18a30 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
18a40 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
18a50 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
18a60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18a70 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
18a80 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
18a90 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
18aa0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18ab0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
18ac0 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
18ad0 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
18ae0 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
18af0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
18b00 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
18b10 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
18b20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
18b30 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
18b40 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
18b50 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
18b60 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
18b70 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
18b80 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
18b90 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e  _PREAD.** any an
18ba0 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
18bb0 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
18bc0 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
18bd0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
18be0 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
18bf0 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
18c00 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
18c10 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
18c20 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
18c30 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
18c40 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
18c50 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
18c60 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
18c70 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
18c80 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
18c90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
18ca0 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
18cb0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
18cc0 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
18cd0 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
18ce0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18cf0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
18d00 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
18d10 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
18d20 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
18d30 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
18d40 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
18d50 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66  );.  cnt &= 0x1f
18d60 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  fff;.  do{.#if d
18d70 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18d80 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
18d90 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
18da0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
18db0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18dc0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
18dd0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
18de0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67  E_PREAD64).    g
18df0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
18e00 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
18e10 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
18e20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
18e30 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
18e40 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
18e50 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
18e60 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
18e70 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18e80 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
18e90 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
18ea0 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
18eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
18ec0 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
18ed0 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
18ee0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18ef0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18f10 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18f20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
18f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18f40 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
18f50 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28     got = osRead(
18f60 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18f70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
18f80 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65  ( got==cnt ) bre
18f90 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c  ak;.    if( got<
18fa0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
18fb0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67  rrno==EINTR ){ g
18fc0 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65  ot = 1; continue
18fd0 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ; }.      prior 
18fe0 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e 69  = 0;.      ((uni
18ff0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19000 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19020 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
19030 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
19040 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
19050 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
19060 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
19070 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
19080 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
19090 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
190a0 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
190b0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
190c0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
190d0 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
190e0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
190f0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
19100 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
19110 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
19120 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
19130 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
19140 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
19150 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
19160 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
19170 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
19180 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
19190 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
191a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
191b0 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
191c0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
191d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
191e0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
191f0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
19200 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19210 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19220 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
19230 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19240 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
19250 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
19260 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
19270 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
19280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
19290 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
192a0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
192b0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
192c0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
192d0 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
192e0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
192f0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
19300 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
19310 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
19320 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
19330 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
19340 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
19350 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
19360 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
19370 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
19380 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
19390 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
193a0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
193b0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
193c0 67 0a 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 74  g.  ** data to t
193d0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
193e0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
193f0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
19400 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
19410 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
19420 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
19430 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
19440 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
19450 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
19460 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
19470 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20  ffset], amt);.  
19480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19490 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
194a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
194b0 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
194c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
194d0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
194e0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
194f0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
19500 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
19510 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
19520 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
19530 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
19540 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
19550 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
19560 7d 0a 20 20 7d 0a 0a 20 20 67 6f 74 20 3d 20 73  }.  }..  got = s
19570 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
19580 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
19590 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
195a0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
195b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
195c0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
195d0 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
195e0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
195f0 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19610 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
19620 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
19630 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19640 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19650 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
19660 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
19670 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
19680 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
19690 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
196a0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
196b0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
196c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
196d0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
196e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
196f0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
19700 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
19710 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
19720 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
19730 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19740 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
19750 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
19760 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
19770 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
19780 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
19790 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
197a0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
197b0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
197c0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
197d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
197e0 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
197f0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
19800 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
19810 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
19820 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
19830 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
19840 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
19850 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19860 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
19870 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  fset;.#endif.  a
19880 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74  ssert( cnt==(cnt
19890 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63  &0x1ffff) );.  c
198a0 6e 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  nt &= 0x1ffff;. 
198b0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
198c0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
198d0 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
198e0 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c   osPwrite(id->h,
198f0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
19900 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  et); }while( got
19910 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
19920 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
19930 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
19940 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
19950 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
19960 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
19970 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  );}while( got<0 
19980 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
19990 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
199a0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
199b0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
199c0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
199d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
199e0 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
199f0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19a00 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
19a10 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
19a20 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19a30 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19a40 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19a50 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
19a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
19a70 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19a80 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
19a90 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
19aa0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19ab0 67 6f 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64  got = osWrite(id
19ac0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
19ad0 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  .  }while( got<0
19ae0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
19af0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
19b00 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
19b10 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
19b20 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19b30 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19b40 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
19b50 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
19b60 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
19b70 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
19b80 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
19b90 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
19ba0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
19bb0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
19bc0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
19bd0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
19be0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
19bf0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
19c00 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
19c10 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
19c20 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
19c30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19c40 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
19c50 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19c60 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
19c70 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
19c80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19c90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
19ca0 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
19cb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
19cc0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
19cd0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
19ce0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
19cf0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
19d00 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
19d10 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
19d20 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
19d30 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
19d40 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
19d50 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
19d60 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
19d70 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
19d80 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
19d90 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
19da0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
19db0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
19dc0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
19dd0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
19de0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
19df0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
19e00 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
19e10 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
19e20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19e30 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
19e40 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
19e50 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
19e60 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
19e70 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
19e80 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
19e90 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
19ea0 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
19eb0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
19ec0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
19ed0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
19ee0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19ef0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
19f00 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
19f10 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
19f20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
19f30 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
19f40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
19f50 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
19f60 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
19f70 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
19f80 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
19f90 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
19fa0 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
19fb0 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
19fc0 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
19fd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19fe0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
19ff0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1a000 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1a010 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1a020 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a030 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a040 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1a050 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1a060 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1a070 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1a080 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1a090 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a0a0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1a0b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1a0c0 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1a0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a0e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
1a0f0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1a100 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
1a110 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1a120 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1a130 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1a140 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1a150 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1a160 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1a170 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1a180 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1a190 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1a1a0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a1b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1a1c0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1a1d0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1a1e0 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
1a1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a200 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1a210 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1a220 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1a230 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1a240 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1a250 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1a260 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1a270 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
1a280 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1a290 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1a2a0 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1a2b0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1a2c0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1a2d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65    }.  }..  while
1a2e0 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
1a2f0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1a300 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1a310 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
1a320 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1a330 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1a340 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1a350 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1a360 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1a370 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a380 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1a390 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1a3a0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1a3b0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1a3c0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1a3d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
1a3e0 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
1a3f0 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
1a400 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
1a410 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1a420 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1a430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a440 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1a450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a460 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a470 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
1a480 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1a490 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1a4a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1a4b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1a4c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1a4d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1a4e0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1a4f0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1a500 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1a510 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1a520 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1a530 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1a540 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1a550 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1a560 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1a570 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1a580 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1a590 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1a5a0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1a5b0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1a5c0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1a5d0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1a5e0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1a5f0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1a600 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1a610 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1a620 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1a630 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1a640 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1a650 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1a660 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1a670 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1a680 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1a690 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1a6a0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1a6b0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
1a6c0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1a6d0 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
1a6e0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1a6f0 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1a700 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1a710 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1a720 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1a730 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1a740 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1a750 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1a760 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1a770 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1a780 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1a790 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1a7a0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1a7b0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1a7c0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1a7d0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a7e0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1a7f0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a800 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1a810 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1a820 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1a830 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1a840 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1a850 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1a860 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1a870 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1a880 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1a890 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1a8a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1a8b0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1a8c0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1a8d0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1a8e0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1a8f0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1a900 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1a910 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1a920 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1a930 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1a940 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1a950 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1a960 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1a970 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1a980 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1a990 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1a9a0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1a9b0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1a9c0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1a9d0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1a9e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1a9f0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1aa00 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1aa10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1aa20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1aa30 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1aa40 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1aa50 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1aa60 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1aa70 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1aa80 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1aa90 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1aaa0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1aab0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1aac0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1aad0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1aae0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1aaf0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1ab00 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1ab10 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1ab20 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1ab30 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1ab40 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1ab50 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1ab60 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1ab70 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1ab80 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1ab90 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1aba0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1abb0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1abc0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1abd0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1abe0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1abf0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1ac00 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1ac10 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1ac20 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1ac30 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1ac40 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1ac50 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1ac60 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1ac70 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1ac80 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1ac90 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1aca0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1acb0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1acc0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1acd0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1ace0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1acf0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1ad00 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1ad10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ad20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1ad30 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1ad40 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1ad50 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1ad60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1ad70 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1ad80 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1ad90 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1ada0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1adb0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1adc0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1add0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1ade0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1adf0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1ae00 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1ae10 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1ae20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1ae30 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1ae40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1ae50 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1ae60 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1ae70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1ae80 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1ae90 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1aea0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1aeb0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1aec0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1aed0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1aee0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1aef0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1af00 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1af10 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1af20 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1af30 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1af40 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1af50 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1af60 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1af70 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1af80 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1af90 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1afa0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1afb0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1afc0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1afd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1afe0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1aff0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1b000 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1b010 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1b020 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1b030 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1b040 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1b050 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1b060 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1b070 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1b080 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1b090 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1b0a0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1b0b0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1b0c0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1b0d0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1b0e0 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1b0f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1b100 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1b110 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1b120 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1b130 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1b140 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1b150 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1b160 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1b170 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1b180 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1b190 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1b1a0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1b1b0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1b1c0 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1b1d0 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1b1e0 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1b1f0 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1b200 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1b210 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1b220 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1b230 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1b240 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1b250 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1b260 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1b270 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1b280 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1b290 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1b2a0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1b2b0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1b2c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1b2d0 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1b2e0 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1b2f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1b300 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1b310 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1b320 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1b330 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1b340 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1b350 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1b360 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1b370 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1b380 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1b390 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1b3a0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1b3b0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1b3c0 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1b3d0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1b3e0 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1b3f0 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1b400 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1b410 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1b420 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1b430 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1b440 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1b450 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1b460 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1b470 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1b480 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1b490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b4a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1b4b0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1b4c0 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1b4d0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1b4e0 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1b4f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b500 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1b510 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1b520 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1b530 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b540 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1b550 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1b560 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1b570 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1b580 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1b590 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1b5a0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1b5b0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1b5c0 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1b5d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1b5e0 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1b5f0 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1b600 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1b610 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1b620 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1b630 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1b640 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1b650 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1b660 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1b670 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1b680 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1b690 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1b6a0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1b6b0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1b6c0 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1b6d0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1b6e0 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1b6f0 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1b700 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1b710 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1b720 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1b730 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1b740 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1b750 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1b760 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1b770 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1b780 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1b790 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1b7a0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1b7b0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1b7c0 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1b7d0 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1b7e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1b7f0 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1b800 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1b810 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1b820 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1b830 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1b840 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1b850 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1b860 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1b870 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1b880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1b890 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b8a0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1b8b0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1b8c0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1b8d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b8e0 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1b8f0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1b900 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1b910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b920 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1b930 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1b940 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1b950 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1b960 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1b970 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1b980 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1b990 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1b9a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1b9b0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1b9c0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1b9d0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1b9e0 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1b9f0 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1ba00 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1ba10 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1ba20 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1ba30 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1ba40 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1ba50 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  fd>=0 ){.      O
1ba60 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1ba70 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1ba80 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1ba90 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1baa0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1bab0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1bac0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1bad0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1bae0 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1baf0 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1bb00 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1bb10 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1bb20 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1bb30 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1bb40 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1bb50 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1bb60 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1bb70 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1bb80 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1bb90 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1bba0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1bbb0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1bbc0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1bbd0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1bbe0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1bbf0 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1bc00 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1bc10 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1bc20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1bc30 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1bc40 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1bc50 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1bc60 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1bc70 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1bc80 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1bc90 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1bca0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1bcb0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1bcc0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1bcd0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1bce0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1bcf0 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1bd00 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1bd10 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1bd20 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1bd30 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1bd40 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1bd50 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1bd60 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1bd70 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1bd80 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1bd90 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1bda0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1bdb0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1bdc0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1bdd0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1bde0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1bdf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1be00 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1be10 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1be20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1be30 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1be40 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1be50 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1be60 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1be70 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1be80 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1be90 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1bea0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1beb0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1bec0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1bed0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1bee0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1bef0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1bf00 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1bf10 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1bf20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1bf30 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1bf40 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1bf50 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1bf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1bf70 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1bf80 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1bf90 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1bfa0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1bfb0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1bfc0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1bfd0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1bfe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1bff0 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1c000 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1c010 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1c020 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1c030 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1c040 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1c050 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1c060 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1c070 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1c080 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1c090 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c0a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1c0b0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1c0c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1c0d0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1c0e0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1c0f0 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1c100 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1c110 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1c120 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1c130 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1c140 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1c150 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1c160 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61   occurrance.  Ma
1c170 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1c180 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1c190 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1c1a0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1c1b0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1c1c0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1c1d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1c1e0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1c1f0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1c200 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1c210 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1c220 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1c230 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1c240 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1c250 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1c260 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1c270 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1c280 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1c290 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1c2a0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1c2b0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1c2c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1c2d0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1c2e0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1c2f0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1c300 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1c310 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1c320 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1c330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1c340 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1c350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c360 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1c370 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1c380 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1c390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c3a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1c3b0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1c3c0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1c3d0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1c3e0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1c3f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1c400 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1c410 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c420 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1c430 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1c440 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1c450 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c460 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1c470 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1c480 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1c490 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1c4a0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1c4b0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1c4c0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1c4d0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1c4e0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1c4f0 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1c500 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1c510 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1c520 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1c530 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1c540 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1c550 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1c560 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1c570 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1c580 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1c590 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1c5a0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1c5b0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1c5c0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c5d0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1c5e0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1c5f0 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1c600 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1c610 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1c620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1c630 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1c640 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c650 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1c660 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1c670 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1c680 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1c690 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c6a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1c6b0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1c6c0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1c6d0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1c6e0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1c6f0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1c700 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1c710 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1c720 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1c730 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1c740 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1c750 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1c760 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1c770 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1c780 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1c790 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1c7a0 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1c7b0 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1c7c0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1c7d0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1c7e0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1c7f0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1c800 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1c810 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1c820 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1c830 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1c840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1c850 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1c860 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1c870 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
1c880 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1c890 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1c8a0 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1c8b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1c8c0 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1c8d0 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1c8e0 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1c8f0 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1c900 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1c910 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1c920 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1c930 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1c940 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1c950 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1c960 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1c970 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c980 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1c990 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1c9a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
1c9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c9c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1c9d0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1c9e0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1c9f0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1ca00 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1ca10 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1ca20 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1ca30 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1ca40 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1ca50 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1ca60 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
1ca70 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1ca80 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
1ca90 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1caa0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
1cab0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
1cac0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1cad0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1cae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1caf0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
1cb00 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
1cb10 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
1cb20 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
1cb30 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
1cb40 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e   the findInodeIn
1cb50 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20  fo() procedure. 
1cb60 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e   ** writes a sin
1cb70 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68  gle byte into th
1cb80 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  at file in order
1cb90 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1cba0 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68  a bug.  ** in th
1cbb0 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c  e OS-X msdos fil
1cbc0 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64  esystem.  In ord
1cbd0 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
1cbe0 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a  lems with upper.
1cbf0 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20    ** layers, we 
1cc00 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  need to report t
1cc10 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73  his file size as
1cc20 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67   zero even thoug
1cc30 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61  h it is.  ** rea
1cc40 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20  lly 1.   Ticket 
1cc50 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3260..  */.  if
1cc60 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70  ( *pSize==1 ) *p
1cc70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65  Size = 0;...  re
1cc80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cc90 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1cca0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1ccb0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1ccc0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48  APPLE__)./*.** H
1ccd0 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79  andler for proxy
1cce0 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f  -locking file-co
1ccf0 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65  ntrol verbs.  De
1cd00 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74  fined below in t
1cd10 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c  he.** proxying l
1cd20 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e  ocking division.
1cd30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1cd40 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1cd50 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1cd60 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  t,void*);.#endif
1cd70 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
1cd80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1cd90 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53   to handle the S
1cda0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1cdb0 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63  _HINT .** file-c
1cdc0 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e  ontrol operation
1cdd0 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64  .  Enlarge the d
1cde0 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65  atabase to nByte
1cdf0 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f  s in size.** (ro
1ce00 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20  unded up to the 
1ce10 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29  next chunk-size)
1ce20 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1ce30 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  se is already.**
1ce40 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65   nBytes or large
1ce50 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
1ce60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1ce70 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
1ce80 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
1ce90 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
1cea0 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  te){.  if( pFile
1ceb0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1cec0 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20     i64 nSize;   
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c   /* Required fil
1cef0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
1cf00 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20  ruct stat buf;  
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1cf20 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75  sed to hold retu
1cf30 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74  rn values of fst
1cf40 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20  at() */.   .    
1cf50 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c  if( osFstat(pFil
1cf60 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65  e->h, &buf) ) re
1cf70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1cf80 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53  R_FSTAT;..    nS
1cf90 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46  ize = ((nByte+pF
1cfa0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20  ile->szChunk-1) 
1cfb0 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  / pFile->szChunk
1cfc0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1cfd0 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  nk;.    if( nSiz
1cfe0 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69  e>(i64)buf.st_si
1cff0 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  ze ){..#if defin
1d000 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
1d010 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
1d020 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1d030 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1d040 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64  de below is hand
1d050 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  ling the return 
1d060 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f  value of osFallo
1d070 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a  cate() .      **
1d080 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69   correctly. posi
1d090 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73  x_fallocate() is
1d0a0 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74   defined to "ret
1d0b0 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63  urns zero on suc
1d0c0 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20  cess, .      ** 
1d0d0 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62  or an error numb
1d0e0 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e  er on  failure".
1d0f0 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65   See the manpage
1d100 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1d110 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  .      int err;.
1d120 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1d130 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63    err = osFalloc
1d140 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75  ate(pFile->h, bu
1d150 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
1d160 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  -buf.st_size);. 
1d170 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72       }while( err
1d180 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
1d190 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72   if( err ) retur
1d1a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1d1b0 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1d1c0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1d1d0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1d1e0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1d1f0 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75  fake it. First u
1d200 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75  se.      ** ftru
1d210 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74  ncate() to set t
1d220 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68  he file size, th
1d230 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  en write a singl
1d240 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20  e byte to.      
1d250 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  ** the last byte
1d260 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77   in each block w
1d270 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64  ithin the extend
1d280 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a  ed region. This.
1d290 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
1d2a0 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75  same technique u
1d2b0 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20  sed by glibc to 
1d2c0 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f  implement posix_
1d2d0 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20  fallocate().    
1d2e0 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20    ** on systems 
1d2f0 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1d300 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74   a real fallocat
1d310 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  e() system call.
1d320 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d330 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73  int nBlk = buf.s
1d340 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46  t_blksize;  /* F
1d350 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b  ile-system block
1d360 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69   size */.      i
1d370 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20  64 iWrite;      
1d380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1d390 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69  xt offset to wri
1d3a0 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20  te to */..      
1d3b0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1d3c0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1d3d0 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
1d3e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1d3f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1d400 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1d410 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1d420 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1d430 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1d440 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1d450 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  }.      iWrite =
1d460 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
1d470 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
1d480 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
1d490 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e   while( iWrite<n
1d4a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1d4b0 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65  int nWrite = see
1d4c0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1d4d0 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1d4e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1d4f0 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1d500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1d510 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69  TE;.        iWri
1d520 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20  te += nBlk;.    
1d530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1d540 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 46 69 6c  .  }..  if( pFil
1d550 65 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3e 30 20 29  e->mmapLimit>0 )
1d560 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1d570 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1d580 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20  hunk<=0 ){.     
1d590 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1d5a0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1d5b0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1d5c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1d5d0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1d5e0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1d5f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d600 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1d610 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1d620 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1d630 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1d640 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1d650 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1d660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d670 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1d680 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1d690 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1d6a0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1d6b0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1d6c0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1d6d0 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1d6e0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1d6f0 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1d700 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1d710 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1d720 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1d730 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1d740 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1d750 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1d760 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1d770 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1d780 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1d790 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1d7a0 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1d7b0 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1d7c0 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1d7d0 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1d7e0 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1d7f0 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1d800 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1d810 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1d820 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1d830 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1d840 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1d850 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1d860 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1d870 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1d880 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1d890 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1d8a0 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1d8b0 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1d8c0 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1d8d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1d8e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d8f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1d900 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1d910 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1d920 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d930 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1d940 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1d950 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1d960 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1d970 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1d980 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1d990 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1d9a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d9b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d9c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
1d9d0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1d9e0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1d9f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1da00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1da10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1da20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1da30 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1da40 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1da50 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1da60 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1da70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1da80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1da90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1daa0 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1dab0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1dac0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1dad0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1dae0 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1daf0 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1db00 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1db10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1db20 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1db30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1db40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1db50 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1db60 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1db70 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1db80 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1db90 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1dba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dbb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1dbc0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1dbd0 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1dbe0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1dbf0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1dc00 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1dc10 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1dc20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dc30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1dc40 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1dc50 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1dc60 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1dc70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1dc80 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1dc90 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1dca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dcb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1dcc0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1dcd0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1dce0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1dcf0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1dd00 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56  alloc( pFile->pV
1dd10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1dd20 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1dd30 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1dd40 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1dd50 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1dd60 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1dd70 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1dd80 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1dd90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1dda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ddb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ddc0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1ddd0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1dde0 46 69 6c 65 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20  File->mmapLimit 
1ddf0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1de00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1de10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1de20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1de30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1de40 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1de50 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1de60 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1de70 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1de80 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1de90 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1dea0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1deb0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1dec0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1ded0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1dee0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1def0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1df00 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1df10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1df20 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1df30 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1df40 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1df50 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1df60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1df70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1df80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1df90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1dfa0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1dfb0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1dfc0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
1dfd0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1dfe0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
1dff0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
1e000 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
1e010 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
1e020 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
1e030 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1e040 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1e050 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1e060 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
1e070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e080 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
1e090 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1e0a0 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
1e0b0 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
1e0c0 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
1e0d0 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
1e0e0 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
1e0f0 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
1e100 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
1e110 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
1e120 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
1e130 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
1e140 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
1e150 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
1e160 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
1e170 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
1e180 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
1e190 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
1e1a0 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
1e1b0 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
1e1c0 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
1e1d0 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
1e1e0 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
1e1f0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1e200 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
1e210 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e  or both..*/.#ifn
1e220 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a  def __QNXNTO__ .
1e230 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1e240 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1e250 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1e260 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1e270 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1e280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1e290 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1e2a0 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ZE;.}.#endif../*
1e2b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1e2c0 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69  g version of uni
1e2d0 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  xSectorSize() is
1e2e0 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 51   optimized for Q
1e2f0 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  NX..*/.#ifdef __
1e300 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64  QNXNTO__.#includ
1e310 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
1e320 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1e330 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
1e340 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1e350 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1e360 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
1e370 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1e380 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
1e390 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
1e3a0 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ize == 0 ){.    
1e3b0 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20 66  struct statvfs f
1e3c0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20  sInfo;.       . 
1e3d0 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c     /* Set defaul
1e3e0 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f  ts for non-suppo
1e3f0 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73  rted filesystems
1e400 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   */.    pFile->s
1e410 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
1e420 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1e430 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c  R_SIZE;.    pFil
1e440 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1e450 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1e460 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28 70    if( fstatvfs(p
1e470 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f  File->h, &fsInfo
1e480 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
1e490 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
1e4a0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1e4b0 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63  }..    if( !strc
1e4c0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
1e4d0 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b  type, "tmp") ) {
1e4e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1e4f0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1e500 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1e510 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1e520 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1e530 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e540 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20  OCAP_ATOMIC4K | 
1e550 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d        /* All ram
1e560 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74   filesystem writ
1e570 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1e580 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1e590 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1e5a0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1e5b0 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1e5c0 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1e600 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1e610 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1e620 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1e630 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1e640 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1e650 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1e690 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1e6a0 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1e6b0 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
1e6c0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1e6d0 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20  etfs") ){.      
1e6e0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e6f0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1e700 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1e710 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1e720 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1e730 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72   /* etfs cluster
1e740 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65   size writes are
1e750 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1e760 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f     (pFile->secto
1e770 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1e780 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1e790 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20  C512) |.        
1e7a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1e7b0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1e7c0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1e7d0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1e7e0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e810 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1e820 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1e830 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1e840 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1e850 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1e860 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1e870 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1e8a0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1e8b0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1e8c0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
1e8d0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1e8e0 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29  etype, "qnx6") )
1e8f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e900 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1e910 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1e920 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1e930 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1e940 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1e950 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20  IOCAP_ATOMIC |  
1e960 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69         /* All fi
1e970 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1e980 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1e990 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1e9a0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1e9b0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1e9c0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1e9d0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1ea10 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1ea20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1ea30 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1ea40 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1ea50 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1ea60 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1eaa0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1eab0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1eac0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1ead0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1eae0 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x4") ){.      pF
1eaf0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1eb00 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1eb10 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1eb20 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1eb30 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
1eb40 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
1eb50 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
1eb60 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
1eb70 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
1eb80 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
1eb90 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1eba0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1ebb0 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
1ebc0 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
1ebd0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1ebe0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1ebf0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1ec00 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1ec10 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1ec40 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1ec50 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1ec60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1ec70 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1ec80 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20  ype, "dos") ){. 
1ec90 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1eca0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1ecb0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1ecc0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1ecd0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1ece0 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
1ecf0 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
1ed00 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
1ed10 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
1ed20 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
1ed30 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1ed40 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1ed50 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1ed60 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
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 7b 0a 20   0;.    }else{. 
1ee10 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1ee20 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1ee30 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
1ee40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1ee50 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f  12 |      /* blo
1ee60 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  cks are atomic *
1ee70 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1ee80 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1ee90 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1eea0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1eeb0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1eec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1eef0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1ef00 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1ef10 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63  .  }.  /* Last c
1ef20 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69  hance verificati
1ef30 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74  on.  If the sect
1ef40 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20  or size isn't a 
1ef50 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a  multiple of 512.
1ef60 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e    ** then it isn
1ef70 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66  't valid.*/.  if
1ef80 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
1ef90 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29  ize % 512 != 0 )
1efa0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  {.    pFile->dev
1efb0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1efc0 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  cs = 0;.    pFil
1efd0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1efe0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1eff0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1f000 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
1f010 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65  sectorSize;.}.#e
1f020 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f  ndif /* __QNXNTO
1f030 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  __ */../*.** Ret
1f040 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
1f050 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
1f060 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  or the file..**.
1f070 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20 73  ** This VFS is s
1f080 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20  et up to return 
1f090 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1f0a0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1f0b0 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20   by default..** 
1f0c0 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63 68  However, that ch
1f0d0 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61 76 65  oice is contrave
1f0e0 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68  rsial since tech
1f0f0 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65  nically the unde
1f100 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73  rlying.** file s
1f110 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61  ystem does not a
1f120 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f  lways provide po
1f130 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69 74  wersafe overwrit
1f140 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a  es.  (In other.*
1f150 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61  * words, after a
1f160 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e   power-loss even
1f170 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  t, parts of the 
1f180 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e  file that were n
1f190 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ever.** written 
1f1a0 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1f1b0 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f  ng altered.)  Ho
1f1c0 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20  wever, non-PSOW 
1f1d0 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72 79  behavior is very
1f1e0 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20  ,.** very rare. 
1f1f0 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50   And asserting P
1f200 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67  SOW makes a larg
1f210 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74  e reduction in t
1f220 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  he amount.** of 
1f230 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72  required I/O for
1f240 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e   journaling, sin
1f250 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64  ce a lot of padd
1f260 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65  ing is eliminate
1f270 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68  d..**  Hence, wh
1f280 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ile POWERSAFE_OV
1f290 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79  ERWRITE is on by
1f2a0 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20   default, there 
1f2b0 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  is a file-contro
1f2c0 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74  l.** available t
1f2d0 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e  o turn it off an
1f2e0 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72 61  d URI query para
1f2f0 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20  meter available 
1f300 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a  to turn it off..
1f310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1f320 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1f330 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1f340 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
1f350 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
1f360 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
1f370 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f  rc = 0;.#ifdef _
1f380 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20  _QNXNTO__.  if( 
1f390 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30  p->sectorSize==0
1f3a0 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a   ) unixSectorSiz
1f3b0 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d  e(id);.  rc = p-
1f3c0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1f3d0 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20  istics;.#endif. 
1f3e0 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67   if( p->ctrlFlag
1f3f0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  s & UNIXFILE_PSO
1f400 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53  W ){.    rc |= S
1f410 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1f420 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b  RSAFE_OVERWRITE;
1f430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f440 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1f450 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f  ITE_OMIT_WAL.../
1f460 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
1f470 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
1f480 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1f490 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
1f4a0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
1f4b0 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
1f4c0 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
1f4d0 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
1f4e0 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
1f4f0 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
1f500 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
1f510 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
1f520 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
1f530 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
1f540 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
1f550 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
1f560 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
1f570 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
1f580 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
1f590 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
1f5a0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
1f5b0 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
1f5c0 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
1f5d0 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
1f5e0 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
1f5f0 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
1f600 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
1f610 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
1f620 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
1f630 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
1f640 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
1f650 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
1f660 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
1f670 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
1f680 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
1f690 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
1f6a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
1f6b0 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
1f6c0 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
1f6d0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1f6e0 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
1f6f0 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
1f700 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
1f710 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
1f720 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
1f730 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
1f740 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
1f750 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
1f760 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
1f770 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
1f780 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
1f790 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1f7a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1f7b0 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
1f7c0 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
1f7d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1f7e0 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
1f7f0 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
1f800 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
1f810 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
1f820 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
1f830 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
1f840 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
1f850 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
1f860 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
1f870 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
1f880 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
1f890 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
1f8a0 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
1f8b0 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
1f8c0 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
1f8d0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
1f8e0 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
1f8f0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1f900 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
1f910 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
1f920 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
1f930 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1f940 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
1f950 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
1f960 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
1f970 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1f990 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
1f9a0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1f9b0 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
1f9c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1f9d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1f9e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1f9f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1fa00 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
1fa10 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1fa20 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f   */.  u16 nRegio
1fa30 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1fa40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
1fa50 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
1fa60 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
1fa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1fa80 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
1fa90 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65  */.  char **apRe
1faa0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1fab0 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70  /* Array of mapp
1fac0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1fad0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1fae0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1faf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fb00 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62  er of unixShm ob
1fb10 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1fb20 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
1fb30 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
1fb40 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e         /* All un
1fb50 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1fb60 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1fb70 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1fb80 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
1fb90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1fba0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1fbb0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
1fbc0 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
1fbd0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1fbe0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1fbf0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1fc00 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
1fc10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1fc20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
1fc30 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
1fc40 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
1fc50 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
1fc60 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1fc70 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
1fc80 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
1fc90 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
1fca0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
1fcb0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
1fcc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1fcd0 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
1fce0 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
1fcf0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1fd00 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
1fd10 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
1fd20 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  .**.**    unixSh
1fd30 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e  m.pFile.**    un
1fd40 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  ixShm.id.**.** A
1fd50 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
1fd60 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
1fd70 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69   The unixShm.pFi
1fd80 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
1fd90 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1fda0 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1fdb0 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1fdc0 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
1fdd0 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  hm {.  unixShmNo
1fde0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1fdf0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1fe00 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ing unixShmNode 
1fe10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
1fe20 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
1fe30 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
1fe40 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
1fe50 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  same unixShmNode
1fe60 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
1fe70 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1fe80 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
1fe90 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  ing the unixShmN
1fea0 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
1feb0 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
1fec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
1fed0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
1fee0 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e  on within its un
1fef0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
1ff00 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
1ff10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ff20 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
1ff30 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
1ff40 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
1ff50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1ff60 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
1ff70 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  s held */.};../*
1ff80 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1ff90 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1ffa0 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
1ffb0 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
1ffc0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1ffd0 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66  *4)         /* f
1ffe0 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
1fff0 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
20000 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f  HM_DMS    (UNIX_
20010 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
20020 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
20030 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
20040 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f  ../*.** Apply po
20050 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
20060 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73  ks for all bytes
20070 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75   from ofst throu
20080 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a  gh ofst+n-1..**.
20090 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
200a0 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78  f the mask is ex
200b0 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43  actly UNIX_SHM_C
200c0 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
200d0 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
200e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
200f0 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  t unixShmSystemL
20100 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  ock(.  unixShmNo
20110 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a  de *pShmNode, /*
20120 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
20130 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
20140 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
20150 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
20160 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  e,          /* F
20170 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c  _UNLCK, F_RDLCK,
20180 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20   or F_WRLCK */. 
20190 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
201a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
201b0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63   byte of the loc
201c0 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20  king range */.  
201d0 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
201e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
201f0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
20200 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
20210 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20   flock f;       
20220 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76  /* The posix adv
20230 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74  isory locking st
20240 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
20250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20260 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
20270 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a  e form fcntl() *
20280 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
20290 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  o the unixShmNod
202a0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
202b0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
202c0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
202d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
202e0 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
202f0 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64  utex) || pShmNod
20300 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
20310 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73   /* Shared locks
20320 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65   never span more
20330 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a   than one byte *
20340 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  /.  assert( n==1
20350 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f   || lockType!=F_
20360 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  RDLCK );..  /* L
20370 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20  ocks are within 
20380 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
20390 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c  t( n>=1 && n<SQL
203a0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
203b0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
203c0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
203d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
203e0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
203f0 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
20400 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
20410 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
20420 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
20430 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
20440 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
20450 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
20460 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
20470 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
20480 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
20490 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
204a0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
204b0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
204c0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
204d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
204e0 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
204f0 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
20500 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
20510 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20520 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
20530 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
20540 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28   "));.  mask = (
20550 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
20560 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
20570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20580 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
20590 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
205a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
205b0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
205c0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
205d0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
205e0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
205f0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
20600 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
20610 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
20620 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
20630 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
20640 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
20650 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
20660 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
20670 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
20680 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
20690 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
206a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
206b0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
206c0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
206d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
206e0 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
206f0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
20700 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
20710 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
20720 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
20730 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
20740 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20750 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
20760 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
20770 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
20780 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
20790 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
207a0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
207b0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
207c0 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
207d0 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
207e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207f0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
20800 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
20810 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
20820 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
20830 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
20840 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
20850 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
20860 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
20870 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
20880 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
20890 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
208a0 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
208b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
208c0 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a        .}.../*.**
208d0 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
208e0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
208f0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
20900 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
20910 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
20920 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
20930 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
20940 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
20950 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
20960 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
20970 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
20980 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
20990 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
209a0 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
209b0 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
209c0 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
209d0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
209e0 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
209f0 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
20a00 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
20a10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
20a20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49     assert( p->pI
20a30 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64  node==pFd->pInod
20a40 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
20a50 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
20a60 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69  utex);.    for(i
20a70 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
20a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
20a90 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
20aa0 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61       munmap(p->a
20ab0 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73  pRegion[i], p->s
20ac0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
20ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
20ae0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
20af0 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20  pRegion[i]);.   
20b00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
20b10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
20b20 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66  pRegion);.    if
20b30 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
20b40 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
20b50 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e  pFd, p->h, __LIN
20b60 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68  E__);.      p->h
20b70 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
20b80 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d   p->pInode->pShm
20b90 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Node = 0;.    sq
20ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
20bb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
20bc0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
20bd0 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
20be0 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62   with open datab
20bf0 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20  ase file pDbFd. 
20c00 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63   .** This partic
20c10 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
20c20 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64  ion uses mmapped
20c30 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
20c40 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69  e file used to i
20c50 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d  mplement shared-
20c60 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65  memory is in the
20c70 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a   same directory.
20c80 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  ** as the open d
20c90 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20ca0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
20cb0 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  me as the open d
20cc0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
20cd0 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20  with the "-shm" 
20ce0 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46  suffix added.  F
20cf0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
20d00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20d10 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73  .** is "/home/us
20d20 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74  er1/config.db" t
20d30 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61  hen the file tha
20d40 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
20d50 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20   mmapped.** for 
20d60 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
20d70 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68  ll be called "/h
20d80 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
20d90 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a  .db-shm".  .**.*
20da0 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61  * Another approa
20db0 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20  ch to is to use 
20dc0 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68  files in /dev/sh
20dd0 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72  m or /dev/tmp or
20de0 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65   an.** some othe
20df0 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42  r tmpfs mount. B
20e00 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20  ut if a file in 
20e10 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65  a different dire
20e20 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68  ctory.** from th
20e30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20e40 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69  is used, then di
20e50 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70  ffering access p
20e60 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72  ermissions.** or
20e70 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68   a chroot() migh
20e80 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66  t cause two diff
20e90 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20  erent processes 
20ea0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64  on the same.** d
20eb0 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75  atabase to end u
20ec0 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e  p using differen
20ed0 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72  t files for shar
20ee0 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20  ed memory - .** 
20ef0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
20f00 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20  ir memory would 
20f10 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68  not really be sh
20f20 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67  ared - resulting
20f30 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  .** in database 
20f40 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76  corruption.  Nev
20f50 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20  ertheless, this 
20f60 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65  tmpfs file usage
20f70 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c  .** can be enabl
20f80 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
20f90 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
20fa0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d  E_SHM_DIRECTORY=
20fb0 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72  "/dev/shm".** or
20fc0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   the equivalent.
20fd0 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65    The use of the
20fe0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
20ff0 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
21000 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73  me.** option res
21010 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  ults in an incom
21020 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66  patible build of
21030 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73   SQLite;  builds
21040 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68   of SQLite.** th
21050 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e  at with differin
21060 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  g SQLITE_SHM_DIR
21070 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20  ECTORY settings 
21080 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74  attempt to use t
21090 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62  he.** same datab
210a0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
210b0 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62  same time, datab
210c0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
210d0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
210e0 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45  sult. The SQLITE
210f0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
21100 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
21110 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  on is considered
21120 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64  .** "unsupported
21130 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61  " and may go awa
21140 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51  y in a future SQ
21150 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a  Lite release..**
21160 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
21170 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
21180 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
21190 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
211a0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
211b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
211c0 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
211d0 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
211e0 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
211f0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
21200 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
21210 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
21220 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
21230 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
21240 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
21250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70  database file (p
21260 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74  DbFd) is using t
21270 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56  he "unix-excl" V
21280 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73  FS.** that means
21290 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69   that an exclusi
212a0 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ve lock is held 
212b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
212c0 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74  file and.** that
212d0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
212e0 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ses are able to 
212f0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
21300 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a  e database.  In.
21310 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  ** that case, we
21320 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e   do not really n
21330 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  eed shared memor
21340 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65  y.  No shared me
21350 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20  mory.** file is 
21360 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68  created.  The sh
21370 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
21380 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69   be simulated wi
21390 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a  th heap memory..
213a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
213b0 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
213c0 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  ry(unixFile *pDb
213d0 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  Fd){.  struct un
213e0 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20  ixShm *p = 0;   
213f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
21400 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
21410 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
21420 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
21430 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68  ShmNode;   /* Th
21440 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
21450 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
21460 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21480 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
21490 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
214a0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
214b0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20     /* The inode 
214c0 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  of fd */.  char 
214d0 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20  *zShmFilename;  
214e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
214f0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
21500 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
21510 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
21520 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21530 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
21540 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
21550 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
21560 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
21570 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
21580 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
21590 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
215a0 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
215b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
215c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
215d0 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
215e0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
215f0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
21600 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
21610 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
21620 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
21630 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
21640 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
21650 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
21660 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
21670 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
21680 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
21690 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
216a0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
216b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
216c0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
216d0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
216e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
216f0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
21700 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
21710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
21720 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
21730 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
21740 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
21750 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
21760 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
21770 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
21780 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
21790 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
217a0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
217b0 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
217c0 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
217d0 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
217e0 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
217f0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
21800 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
21810 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26  Fd->h, &sStat) &
21820 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  & pInode->bProce
21830 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
21840 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
21850 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
21860 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
21870 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  err;.    }..#ifd
21880 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
21890 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d  RECTORY.    nShm
218a0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f  Filename = sizeo
218b0 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f(SQLITE_SHM_DIR
218c0 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65  ECTORY) + 31;.#e
218d0 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  lse.    nShmFile
218e0 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29  name = 6 + (int)
218f0 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50  strlen(pDbFd->zP
21900 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
21910 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
21920 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
21930 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
21940 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
21950 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
21960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
21970 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21980 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
21990 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
219a0 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
219b0 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
219c0 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
219d0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
219e0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
219f0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
21a00 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
21a10 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
21a20 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
21a30 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
21a40 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
21a50 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
21a60 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
21a70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21a80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
21a90 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
21aa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21ab0 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
21ac0 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
21ad0 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
21ae0 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
21af0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
21b00 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
21b10 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
21b20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
21b30 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
21b40 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
21b50 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  th, zShmFilename
21b60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
21b70 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a  hmNode->h = -1;.
21b80 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64      pDbFd->pInod
21b90 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  e->pShmNode = pS
21ba0 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  hmNode;.    pShm
21bb0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70  Node->pInode = p
21bc0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
21bd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65    pShmNode->mute
21be0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
21bf0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
21c00 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
21c10 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
21c20 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
21c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21c40 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
21c50 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
21c60 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  }..    if( pInod
21c70 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
21c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
21c90 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
21ca0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
21cb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
21cc0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46  uri_boolean(pDbF
21cd0 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f  d->zPath, "reado
21ce0 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a  nly_shm", 0) ){.
21cf0 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67          openFlag
21d00 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
21d10 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21d20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
21d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
21d40 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
21d50 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
21d60 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  name, openFlags,
21d70 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26   (sStat.st_mode&
21d80 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66  0777));.      if
21d90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
21da0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21db0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
21dc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
21dd0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46  T, "open", zShmF
21de0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
21df0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
21e00 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  err;.      }..  
21e10 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
21e20 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
21e30 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20  g as root, make 
21e40 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48  sure that the SH
21e50 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  M file.      ** 
21e60 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
21e70 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f  same user that o
21e80 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  wns the original
21e90 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65   database.  Othe
21ea0 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
21eb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e  the original own
21ec0 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  er will not be a
21ed0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a  ble to connect..
21ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f        */.      o
21ef0 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65  sFchown(pShmNode
21f00 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69  ->h, sStat.st_ui
21f10 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29  d, sStat.st_gid)
21f20 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68  ;.  .      /* Ch
21f30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
21f40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
21f50 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
21f60 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
21f70 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
21f80 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
21f90 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
21fa0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
21fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21fc0 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
21fd0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
21fe0 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
21ff0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
22000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22010 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
22020 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
22030 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
22040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
22050 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
22060 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
22070 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53   "ftruncate", zS
22080 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
22090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
220a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
220b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
220c0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
220d0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
220e0 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
220f0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
22100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22110 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
22120 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
22130 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
22140 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
22150 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
22160 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
22170 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
22180 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
22190 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
221a0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
221b0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
221c0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
221d0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
221e0 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
221f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
22200 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
22210 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
22220 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
22230 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
22240 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
22250 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
22260 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
22270 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
22280 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
22290 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
222a0 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
222b0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
222c0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
222d0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
222e0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
222f0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
22300 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
22310 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
22320 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
22330 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
22340 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
22350 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
22360 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
22370 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
22380 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22390 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
223a0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
223b0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
223c0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
223d0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
223e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
223f0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
22400 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
22410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
22420 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
22430 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
22440 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
22450 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
22460 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
22470 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
22480 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
22490 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
224a0 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
224b0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
224c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
224d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
224e0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
224f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
22500 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
22510 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
22520 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
22530 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
22540 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
22550 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
22560 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
22570 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
22580 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
22590 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
225a0 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
225b0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
225c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
225d0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
225e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
225f0 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
22600 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
22610 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
22620 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
22630 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
22640 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
22650 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
22660 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
22670 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
22680 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
22690 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
226a0 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
226b0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
226c0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
226d0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
226e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
226f0 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
22700 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
22710 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
22720 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
22730 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
22740 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
22750 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
22760 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
22770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
22780 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
22790 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
227a0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
227b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
227c0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
227d0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
227e0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
227f0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
22800 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
22810 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
22820 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
22830 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
22840 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
22850 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
22860 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
22870 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
22880 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
22890 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
228a0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
228b0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
228c0 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
228d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
228e0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
228f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
22900 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
22910 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
22940 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
22950 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
22960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22970 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
22980 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
22990 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
229a0 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
229b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
229c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
229d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
229e0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
229f0 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
22a00 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
22a10 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
22a20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22a30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
22a40 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
22a50 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
22a60 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
22a70 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
22a80 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
22a90 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
22aa0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
22ab0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
22ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
22ae0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
22af0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
22b00 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
22b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22b20 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
22b30 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
22b40 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
22b50 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
22b60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
22b70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22b80 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
22b90 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
22ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
22bb0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
22bc0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
22bd0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
22be0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
22bf0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
22c00 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
22c10 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
22c20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
22c30 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
22c40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
22c50 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
22c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
22c70 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
22c80 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
22c90 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
22ca0 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
22cb0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
22cc0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
22cd0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
22ce0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
22cf0 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
22d00 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
22d10 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
22d20 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
22d30 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
22d40 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
22d50 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
22d60 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
22d70 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
22d80 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
22d90 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
22da0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22db0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
22dc0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
22dd0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
22de0 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
22df0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
22e00 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
22e10 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
22e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22e30 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
22e40 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
22e50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22e60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
22e70 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
22e80 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
22e90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
22ea0 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
22eb0 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
22ec0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
22ed0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
22ee0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
22ef0 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
22f00 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
22f10 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
22f20 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
22f30 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
22f40 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
22f50 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
22f60 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e         ** Altern
22f70 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
22f80 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65  end is true, use
22f90 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
22fa0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 20  allocate.       
22fb0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
22fc0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
22fd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22fe0 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
22ff0 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
23000 6f 75 74 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  out;.#if defined
23010 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
23020 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
23030 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
23040 20 20 20 20 20 20 20 69 66 28 20 6f 73 46 61 6c         if( osFal
23050 6c 6f 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  locate(pShmNode-
23060 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  >h, sStat.st_siz
23070 65 2c 20 6e 42 79 74 65 29 21 3d 30 20 29 7b 0a  e, nByte)!=0 ){.
23080 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
23090 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
230a0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
230b0 2c 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 0a 20  , "fallocate",. 
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
230e0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
230f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23100 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
23110 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
23120 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
23130 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
23140 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  de->h, nByte) ){
23150 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23160 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
23170 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
23180 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a  E, "ftruncate",.
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
231b0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
231c0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
231d0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
231e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
231f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23200 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
23210 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
23220 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
23230 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
23240 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
23250 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29  pNew = (char **)
23260 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
23270 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
23280 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52  e->apRegion, (iR
23290 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
232a0 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20  char *).    );. 
232b0 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
232c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
232d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
232e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
232f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
23300 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
23310 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
23320 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65    while(pShmNode
23330 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
23340 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  on){.      void 
23350 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  *pMem;.      if(
23360 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
23370 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  ){.        pMem 
23380 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69  = mmap(0, szRegi
23390 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
233a0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
233b0 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
233c0 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
233d0 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
233e0 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
233f0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
23400 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
23410 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
23420 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
23430 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
23440 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
23450 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23460 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23470 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
23480 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
23490 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
234a0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
234b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
234c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
234d0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
234e0 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69  e3_malloc(szRegi
234f0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  on);.        if(
23500 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
23510 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23520 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23530 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
23540 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
23550 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d         memset(pM
23560 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  em, 0, szRegion)
23570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23580 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
23590 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
235a0 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20  gion] = pMem;.  
235b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
235c0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
235d0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
235e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
235f0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
23600 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
23610 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
23620 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
23630 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
23640 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
23650 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
23660 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
23670 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
23680 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
23690 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
236a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
236b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
236c0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
236d0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
236e0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
236f0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
23700 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
23710 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
23720 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
23730 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
23740 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
23750 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
23760 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
23770 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
23780 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
23790 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
237a0 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
237b0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
237c0 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
237d0 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
237e0 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
237f0 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
23800 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
23810 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
23820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23830 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
23840 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
23850 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23860 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
23870 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
23880 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
238b0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
238c0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
238d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
238f0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
23900 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
23910 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23930 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
23940 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
23950 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
23960 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
23970 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
23980 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
23990 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
239a0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
239b0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
239c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
239d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
239e0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
239f0 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
23a20 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
23a30 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
23a40 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
23a50 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
23a60 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23a70 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
23a80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23a90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
23aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
23ab0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
23ac0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
23af0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
23b00 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
23b10 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
23b20 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
23b30 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
23b40 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
23b50 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
23b60 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
23b70 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
23b80 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
23b90 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
23ba0 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
23bb0 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
23bc0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
23bd0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
23be0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
23bf0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
23c00 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
23c10 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
23c20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
23c30 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
23c40 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
23c50 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
23c60 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
23c70 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
23c80 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
23c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
23ca0 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
23cb0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
23cc0 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
23cd0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
23ce0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
23cf0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
23d00 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
23d10 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
23d20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
23d30 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
23d40 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
23d50 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
23d60 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
23d70 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
23d80 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
23d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
23da0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
23db0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
23dc0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
23dd0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
23de0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
23df0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
23e00 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
23e10 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
23e20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
23e30 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
23e40 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
23e50 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
23e60 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
23e70 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
23e80 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
23e90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23ea0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
23eb0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
23ec0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
23ed0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
23ee0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
23ef0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
23f00 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
23f10 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
23f20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
23f30 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
23f40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
23f50 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
23f60 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
23f70 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
23f80 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
23f90 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
23fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
23fb0 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
23fc0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
23fd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ff0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
24000 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
24010 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
24020 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
24030 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
24040 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
24050 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
24060 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
24070 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
24080 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
24090 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
240a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
240b0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
240c0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
240d0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
240e0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
240f0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
24100 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
24110 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
24120 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
24130 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
24140 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
24150 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
24160 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
24170 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
24180 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
24190 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
241a0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
241b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
241c0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
241d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
241e0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
241f0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
24200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
24210 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
24220 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
24230 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
24240 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
24250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24260 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
24270 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
24280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
24290 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
242a0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
242b0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
242c0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
242d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
242e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
242f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
24300 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
24310 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
24320 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
24330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24340 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
24350 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
24360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
24370 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
24380 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
24390 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
243a0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
243b0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
243c0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
243d0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
243e0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
243f0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
24400 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
24410 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
24420 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
24430 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
24440 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
24450 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
24460 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24470 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
24480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
244a0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
244b0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
244c0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
244d0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
244e0 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
244f0 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
24500 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
24510 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
24520 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
24530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24540 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
24550 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
24560 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
24570 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
24580 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
24590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
245b0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
245c0 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
245d0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
245e0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
245f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
24600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
24610 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
24620 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
24630 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
24640 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
24650 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
24660 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
24670 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
24680 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
24690 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
246a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
246b0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
246c0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
246d0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
246e0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
246f0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
24700 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
24710 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
24720 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
24730 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
24740 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
24750 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
24760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24770 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
24780 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
24790 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
247a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
247b0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
247c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
247d0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
247e0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
247f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
24800 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24810 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
24820 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
24830 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
24840 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
24850 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
24860 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
24870 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
24880 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
24890 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
248a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
248b0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
248c0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
248d0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
248e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
248f0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
24900 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
24910 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
24920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
24930 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
24940 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
24950 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
24960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
24970 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
24980 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
24990 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
249c0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
249d0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
249e0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
249f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
24a00 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
24a10 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
24a20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
24a50 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
24a60 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
24a70 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a90 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24aa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24ab0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
24ac0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
24ad0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
24ae0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
24af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
24b00 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
24b10 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
24b20 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
24b30 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
24b40 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
24b50 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24b60 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24b70 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
24b80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
24b90 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
24ba0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
24bb0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
24bc0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
24bd0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
24be0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
24bf0 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
24c00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
24c10 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
24c20 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
24c30 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
24c40 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
24c50 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
24c60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24c70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
24c80 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
24c90 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
24ca0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
24cb0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
24cc0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
24cd0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
24ce0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
24cf0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
24d00 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
24d10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
24d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
24d30 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
24d40 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
24d50 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
24d60 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
24d70 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
24d80 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
24d90 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28  h>=0 ) osUnlink(
24da0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
24db0 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
24dc0 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
24dd0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
24de0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
24df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
24e00 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
24e10 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
24e20 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
24e30 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
24e40 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
24e50 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
24e60 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
24e70 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
24e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
24e90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  */../*.** Argume
24ea0 6e 74 73 20 78 20 61 6e 64 20 79 20 61 72 65 20  nts x and y are 
24eb0 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2e 20 41  both integers. A
24ec0 72 67 75 6d 65 6e 74 20 79 20 6d 75 73 74 20 62  rgument y must b
24ed0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a  e a power of 2..
24ee0 2a 2a 20 52 6f 75 6e 64 20 78 20 75 70 20 74 6f  ** Round x up to
24ef0 20 74 68 65 20 6e 65 61 72 65 73 74 20 69 6e 74   the nearest int
24f00 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
24f10 20 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a   y. For example:
24f20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44  .**.**     ROUND
24f30 55 50 28 30 2c 20 20 38 29 20 2d 3e 20 20 30 0a  UP(0,  8) ->  0.
24f40 2a 2a 20 20 20 20 20 52 4f 55 4e 44 55 50 28 31  **     ROUNDUP(1
24f50 33 2c 20 38 29 20 2d 3e 20 31 36 0a 2a 2a 20 20  3, 8) -> 16.**  
24f60 20 20 20 52 4f 55 4e 44 55 50 28 33 32 2c 20 38     ROUNDUP(32, 8
24f70 29 20 2d 3e 20 33 32 0a 2a 2f 0a 23 64 65 66 69  ) -> 32.*/.#defi
24f80 6e 65 20 52 4f 55 4e 44 55 50 28 78 2c 79 29 20  ne ROUNDUP(x,y) 
24f90 20 20 20 20 28 28 28 78 29 2b 79 2d 31 29 26 7e      (((x)+y-1)&~
24fa0 28 79 2d 31 29 29 0a 0a 73 74 61 74 69 63 20 76  (y-1))..static v
24fb0 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
24fc0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
24fd0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
24fe0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
24ff0 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70  .  if( pFd->pMap
25000 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6d 75  Region ){.    mu
25010 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
25020 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 4f  gion, pFd->mmapO
25030 72 69 67 73 69 7a 65 29 3b 0a 20 20 20 20 70 46  rigsize);.    pF
25040 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
25050 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
25060 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
25070 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20  d->mmapOrigsize 
25080 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
25090 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
250a0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
250b0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
250c0 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  i64 nMap = nByte
250d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
250e0 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
250f0 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
25100 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
25110 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
25120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25130 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
25140 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
25150 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
25160 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
25170 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
25180 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
25190 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26  sFstat(pFd->h, &
251a0 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
251b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
251c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
251d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
251e0 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
251f0 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
25200 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
25210 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69  nMap>pFd->mmapLi
25220 6d 69 74 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  mit ){.    nMap 
25230 3d 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74  = pFd->mmapLimit
25240 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61  ;.  }..  if( nMa
25250 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
25260 20 29 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61   ){.    unixUnma
25270 70 66 69 6c 65 28 70 46 64 29 3b 0a 0a 20 20 20  pfile(pFd);..   
25280 20 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20   if( nMap>0 ){. 
25290 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b       void *pNew;
252a0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
252b0 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 0a 20 20   = PROT_READ;.  
252c0 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
252d0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
252e0 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20  LE_RDONLY)==0 ) 
252f0 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52  flags |= PROT_WR
25300 49 54 45 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ITE;.      pNew 
25310 3d 20 6d 6d 61 70 28 30 2c 20 52 4f 55 4e 44 55  = mmap(0, ROUNDU
25320 50 28 6e 4d 61 70 2c 20 34 30 39 36 29 2c 20 66  P(nMap, 4096), f
25330 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
25340 2c 20 70 46 64 2d 3e 68 2c 20 30 29 3b 0a 20 20  , pFd->h, 0);.  
25350 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
25360 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
25370 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25380 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41 50 3b 0a  E_IOERR_MREMAP;.
25390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
253a0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
253b0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 46 64   pNew;.      pFd
253c0 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20 3d  ->mmapOrigsize =
253d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
253e0 20 6e 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   nMap;.    }.  }
253f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
25400 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
25410 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71  int unixFetch(sq
25420 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
25430 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
25440 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
25450 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
25460 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64  = (unixFile *)fd
25470 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
25480 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
25490 69 6c 65 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 30  ile */.  *pp = 0
254a0 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  ;..  if( pFd->mm
254b0 61 70 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20  apLimit>0 ){.   
254c0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
254d0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
254e0 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61   int rc = unixMa
254f0 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a  pfile(pFd, -1);.
25500 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25510 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25520 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
25530 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
25540 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
25550 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
25560 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
25570 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
25580 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
25590 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t++;.    }.  }. 
255a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
255b0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
255c0 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c   unixUnfetch(sql
255d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 76  ite3_file *fd, v
255e0 6f 69 64 20 2a 70 29 7b 0a 20 20 75 6e 69 78 46  oid *p){.  unixF
255f0 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
25600 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
25610 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25620 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25630 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
25640 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
25650 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28  ut==0) );..  if(
25660 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
25670 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
25680 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
25690 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
256a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
256b0 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
256c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
256d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
256e0 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
256f0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
25700 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
25710 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
25720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25730 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
25740 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
25750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
25770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
257a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
257b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
257c0 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
257d0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
257e0 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
257f0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
25800 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
25810 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
25820 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
25830 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
25840 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
25850 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
25860 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
25870 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
25880 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
25890 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
258a0 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
258b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
258c0 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
258d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
258e0 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
258f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
25900 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
25910 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
25920 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
25930 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
25940 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
25950 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
25960 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
25970 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
25980 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
25990 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
259a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
259b0 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
259c0 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
259d0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
259e0 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
259f0 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
25a00 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
25a10 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
25a20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
25a30 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
25a40 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
25a50 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
25a60 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20   finder-funtion 
25a70 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
25a80 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
25a90 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
25aa0 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
25ab0 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
25ac0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
25ad0 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
25ae0 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
25af0 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
25b00 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
25b10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
25b20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
25b30 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
25b40 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
25b50 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
25b60 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
25b70 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
25b80 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
25b90 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
25ba0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
25bb0 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
25bc0 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
25bd0 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
25be0 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
25bf0 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
25c00 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
25c10 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
25c20 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
25c30 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
25c40 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
25c50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
25c60 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
25c70 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
25c80 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
25c90 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
25ca0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
25cb0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
25cc0 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
25cd0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
25ce0 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
25cf0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
25d00 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
25d10 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
25d20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
25d30 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
25d40 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
25d50 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52  DER, METHOD, VER
25d60 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43  SION, CLOSE, LOC
25d70 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43  K, UNLOCK, CKLOC
25d80 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63  K)      \.static
25d90 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25da0 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
25db0 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
25de0 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
25df0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
25e00 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
25e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25e40 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
25e50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
25e80 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
25e90 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
25ea0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
25ed0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
25ee0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
25ef0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
25f20 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
25f30 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
25f40 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
25fc0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
25fd0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
25fe0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26020 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26050 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
260a0 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260c0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
260d0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
260f0 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
26100 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
26110 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26140 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26160 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
26190 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
261a0 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
261b0 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
261c0 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
261d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
261e0 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  nixShmMap,      
261f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
26200 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26220 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
26230 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
26240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
26250 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
26280 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
26290 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
262a0 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
262d0 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
262e0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
262f0 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
26320 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
26330 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
26340 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
26370 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
26380 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
26390 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
26410 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
26420 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
26430 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
26440 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
26450 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
26460 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
26470 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
264b0 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26540 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
26550 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
26560 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
26570 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
26580 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
26590 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
265a0 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
265b0 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
265c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
265d0 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
265e0 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
265f0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
26600 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
26610 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
26620 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
26630 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
26640 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
26650 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
26660 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
26670 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
26680 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
26690 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
266a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
266b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
266c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
266d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
266e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
266f0 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
26700 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
26710 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26730 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
26740 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26760 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
26770 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26790 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
267a0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
267b0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
267c0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
267d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
267e0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
267f0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
26800 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
26810 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
26820 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
26830 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
26840 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
26850 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
26860 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26880 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
26890 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
268a0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
268b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
268c0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
268d0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
268e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
268f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
26900 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
26910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
26920 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
26930 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
26940 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
26950 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26960 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
26970 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
26980 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
26990 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
269a0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
269b0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
269c0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
269d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
269e0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
269f0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
26a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
26a10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
26a20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
26a30 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
26a40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
26a50 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
26a60 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
26a70 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
26a80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
26a90 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
26aa0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
26ab0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
26ac0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
26ad0 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
26ae0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
26af0 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
26b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26b10 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
26b20 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
26b30 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
26b40 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
26b50 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
26b60 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
26b70 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
26b80 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
26b90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
26ba0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
26bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
26bd0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
26be0 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
26bf0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
26c00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
26c10 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
26c20 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
26c30 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
26c40 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
26c50 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
26c60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
26c70 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
26c80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
26c90 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
26ca0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
26cb0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
26cc0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
26cd0 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
26ce0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
26cf0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
26d00 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
26d10 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
26d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
26d30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26d40 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
26d50 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d70 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
26d80 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
26d90 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
26da0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
26db0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
26dc0 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
26dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
26de0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
26df0 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
26e00 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
26e10 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
26e20 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
26e30 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
26e40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
26e50 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
26e60 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
26e70 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
26e80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
26e90 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
26ea0 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
26eb0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26ec0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
26ed0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
26ee0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
26ef0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
26f00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26f10 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
26f40 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
26f50 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
26f60 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
26f70 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
26f80 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
26f90 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
26fa0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
26fb0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
26fc0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
26fd0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
26fe0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
26ff0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
27000 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
27010 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
27020 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
27030 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
27040 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
27050 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
27060 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
27070 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
27080 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
27090 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
270a0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
270b0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
270c0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
270d0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
270e0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
270f0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
27100 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
27110 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
27120 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
27130 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
27140 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
27150 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
27160 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
27170 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
27180 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
27190 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
271a0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
271b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
271c0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
271d0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
271e0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
271f0 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
27200 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
27210 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
27220 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
27230 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
27240 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
27250 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
27260 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
27270 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
27280 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
27290 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
272a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
272b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
272c0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
272d0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
272e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
272f0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
27300 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
27310 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
27320 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
27330 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
27340 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
27350 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
27360 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
27370 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
27380 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273a0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
273b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
273c0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
273d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
273e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
273f0 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
27400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27410 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
27420 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
27430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
27440 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
27450 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
27460 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
27470 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
27480 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
27490 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
274a0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
274b0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
274c0 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
274d0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
274e0 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
274f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
27500 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27510 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
27520 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
27530 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
27540 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
27550 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
27560 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
27570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
27580 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27590 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
275a0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
275d0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
275e0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
275f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
27600 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
27610 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
27620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
27630 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
27640 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
27650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
27660 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
27670 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
27680 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
27690 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
276a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
276b0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
276c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
276d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
276e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
276f0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
27700 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
27710 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
27720 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
27730 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
27740 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
27750 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
27760 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
27770 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
27780 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
27790 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
277a0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
277b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
277c0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
277d0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
277e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
277f0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
27800 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
27810 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
27820 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
27830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27840 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
27850 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
27860 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
27870 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
27880 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
27890 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
278a0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
278b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
278c0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
278d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
278e0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
278f0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
27900 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27910 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
27920 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
27930 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
27940 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
27950 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
27960 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
27970 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
27980 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
27990 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
279a0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
279b0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
279c0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
279d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
279e0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
279f0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
27a00 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
27a10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
27a20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
27a30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
27a40 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
27a50 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
27a60 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
27a70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
27a80 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
27a90 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
27aa0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
27ab0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
27ac0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
27ad0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
27ae0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
27af0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
27b00 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
27b10 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
27b20 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
27b30 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
27b40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
27b50 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
27b60 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
27b70 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
27b80 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
27b90 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
27ba0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
27bb0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
27bc0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
27bd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
27be0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
27bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27c00 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
27c10 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
27c20 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
27c30 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
27c40 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
27c50 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
27c60 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
27c70 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
27c80 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
27c90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
27ca0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
27cb0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
27cc0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
27cd0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
27ce0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
27cf0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
27d00 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
27d10 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
27d20 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
27d30 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
27d40 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
27d50 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
27d60 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
27d70 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
27d80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
27d90 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
27da0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
27db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
27dc0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
27dd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
27de0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
27df0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
27e00 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
27e10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27e20 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
27e30 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
27e40 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
27e50 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
27e60 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
27e70 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
27e80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
27e90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
27ea0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
27eb0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
27ec0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
27ed0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
27ee0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
27ef0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
27f00 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
27f10 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
27f20 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
27f30 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
27f40 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
27f50 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
27f60 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
27f70 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
27f80 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
27f90 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
27fa0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
27fb0 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
27fc0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
27fd0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
27fe0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
27ff0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
28000 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
28010 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
28020 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28030 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
28040 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
28050 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
28060 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
28070 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
28080 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
28090 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
280a0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
280b0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
280c0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
280d0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
280e0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
280f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
28100 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
28110 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
28120 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
28130 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
28140 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
28150 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
28160 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
28170 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
28180 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
28190 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
281a0 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
281b0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
281c0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
281d0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
281e0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
281f0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
28200 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
28210 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
28220 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
28230 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
28240 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
28250 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
28260 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
28270 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
28280 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
28290 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
282a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
282b0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
282c0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
282d0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
282e0 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
282f0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
28300 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
28310 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
28320 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28330 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
28340 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
28350 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
28360 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
28370 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
28380 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
28390 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
283a0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
283b0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
283c0 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
283d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28410 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
28420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28430 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
28440 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
28450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28460 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
28470 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
28480 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
28490 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
284a0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
284b0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
284c0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
284d0 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
284e0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
284f0 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
28500 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
28510 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
28520 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
28530 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
28540 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28550 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
28560 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
28570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28580 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
28590 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
285a0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
285b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
285c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
285d0 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
285e0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
285f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28600 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
28610 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
28620 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
28630 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20   int ctrlFlags  
28640 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
28650 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c   or more UNIXFIL
28660 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  E_* values */.){
28670 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
28680 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
28690 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
286a0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
286b0 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
286c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
286d0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
286e0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
286f0 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  ULL );..  /* Usu
28700 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
28710 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
28720 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
28730 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
28740 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
28750 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
28760 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
28770 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
28780 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
28790 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
287a0 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
287b0 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
287c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
287d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
287e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
287f0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
28800 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
28810 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
28820 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
28830 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
28840 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
28850 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
28860 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
28870 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
28880 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
28890 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
288a0 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
288b0 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
288c0 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
288d0 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  | (ctrlFlags & U
288e0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21  NIXFILE_NOLOCK)!
288f0 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
28900 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
28910 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
28920 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
28930 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56   = h;.  pNew->pV
28940 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65  fs = pVfs;.  pNe
28950 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
28960 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74  name;.  pNew->ct
28970 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74  rlFlags = (u8)ct
28980 72 6c 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 73  rlFlags;.  if( s
28990 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
289a0 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26  an(((ctrlFlags &
289b0 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f   UNIXFILE_URI) ?
289c0 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c   zFilename : 0),
289d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
289e0 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f              "pso
289f0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
28a00 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
28a10 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
28a20 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
28a30 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69  LE_PSOW;.  }.  i
28a40 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e  f( strcmp(pVfs->
28a50 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
28a60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ")==0 ){.    pNe
28a70 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
28a80 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
28a90 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
28aa0 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
28ab0 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
28ac0 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
28ad0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
28ae0 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
28af0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
28b00 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
28b10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28b20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
28b30 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
28b40 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20  FILE_NOLOCK ){. 
28b50 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
28b60 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
28b70 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
28b80 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
28b90 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
28ba0 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
28bb0 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
28bc0 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
28bd0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28be0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
28bf0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
28c00 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
28c10 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
28c20 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
28c30 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
28c40 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
28c50 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
28c60 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
28c70 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
28c80 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
28c90 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
28ca0 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
28cb0 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
28cc0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
28cd0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
28ce0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
28cf0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
28d00 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
28d10 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
28d20 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
28d30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
28d40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28d50 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
28d60 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
28d70 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
28d80 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
28d90 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
28da0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
28db0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
28dc0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
28dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28de0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
28df0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
28e00 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
28e10 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
28e20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
28e30 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
28e40 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
28e50 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
28e60 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
28e70 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
28e80 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
28e90 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
28ea0 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
28eb0 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
28ec0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
28ed0 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
28ee0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
28ef0 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
28f00 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
28f10 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
28f20 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
28f30 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
28f40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
28f50 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
28f60 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
28f70 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
28f80 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
28f90 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
28fa0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
28fb0 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
28fc0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
28fd0 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
28fe0 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
28ff0 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
29000 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
29010 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
29020 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
29030 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
29040 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
29050 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
29060 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
29070 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
29080 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
29090 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
290a0 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
290b0 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
290c0 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
290d0 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
290e0 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
290f0 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
29100 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
29110 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
29120 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
29130 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
29140 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
29150 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
29160 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
29170 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
29180 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
29190 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
291a0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
291b0 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
291c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
291d0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
291e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
291f0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
29200 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
29210 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
29220 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
29230 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
29240 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
29250 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
29260 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
29270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
29280 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
29290 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
292a0 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
292b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
292c0 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
292d0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
292e0 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
292f0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
29300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29310 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
29320 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
29330 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
29340 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
29350 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
29360 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
29370 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
29380 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
29390 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
293a0 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
293b0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
293c0 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
293d0 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
293e0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
293f0 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
29400 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
29410 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
29420 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
29430 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
29440 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
29450 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
29460 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
29470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29490 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
294a0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
294b0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
294c0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
294d0 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
294e0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
294f0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
29500 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
29510 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
29520 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
29530 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
29540 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
29550 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
29560 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
29570 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
29580 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
29590 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
295a0 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
295b0 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
295c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
295d0 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
295e0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
295f0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
29600 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
29610 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
29620 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
29630 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
29640 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
29650 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
29660 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
29670 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
29680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
29690 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
296a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
296b0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
296c0 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
296d0 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
296e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
296f0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
29700 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
29710 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
29720 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
29730 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
29740 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
29750 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
29760 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
29770 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
29780 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
29790 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
297a0 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
297b0 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
297c0 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
297d0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
297e0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
297f0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
29800 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
29810 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
29820 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
29830 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
29840 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
29850 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
29860 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
29870 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
29880 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
29890 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
298a0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
298b0 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
298c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
298d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
298e0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
298f0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
29900 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
29910 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
29920 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
29930 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
29940 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
29950 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
29960 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
29970 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
29980 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
29990 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
299a0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
299b0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
299c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
299d0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
299e0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
299f0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
29a00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
29a10 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
29a20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
29a30 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
29a40 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
29a50 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
29a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29a70 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
29a80 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
29a90 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
29aa0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
29ab0 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
29ac0 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
29ad0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44  0;.  }.  if( isD
29ae0 65 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74  elete ) pNew->ct
29af0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
29b00 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  ILE_DELETE;.#end
29b10 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
29b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
29b30 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
29b40 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
29b50 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
29b60 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
29b70 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
29b80 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
29b90 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
29ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29bc0 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
29bd0 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
29be0 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
29bf0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
29c00 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
29c10 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
29c20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
29c30 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
29c40 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
29c50 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
29c60 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
29c70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
29c80 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
29c90 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
29ca0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
29cb0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
29cc0 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
29cd0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
29ce0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
29cf0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
29d00 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
29d10 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
29d20 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
29d30 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
29d40 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
29d50 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
29d60 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
29d70 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
29d80 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
29d90 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
29da0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
29db0 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
29dc0 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
29dd0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
29de0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
29df0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
29e00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29e10 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
29e20 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
29e30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
29e40 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
29e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29e60 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
29e70 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
29e80 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
29e90 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
29ea0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
29eb0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
29ec0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
29ed0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
29ee0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
29ef0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
29f00 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
29f10 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
29f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29f30 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
29f40 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
29f50 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
29f60 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
29f70 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
29f80 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
29f90 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
29fa0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
29fb0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
29fc0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
29fd0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
29fe0 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
29ff0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
2a000 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2a010 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2a020 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2a030 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2a040 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2a050 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2a060 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2a070 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2a080 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2a090 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
2a0a0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
2a0b0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2a0c0 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2a0d0 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2a0e0 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2a0f0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
2a100 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
2a110 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
2a120 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
2a130 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
2a140 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2a150 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
2a160 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
2a170 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
2a180 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
2a190 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
2a1a0 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
2a1b0 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
2a1c0 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
2a1d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a1e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2a1f0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
2a200 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
2a210 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -18, zBuf, "%s/"
2a220 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2a230 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
2a240 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
2a250 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
2a260 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2a270 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
2a280 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2a290 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
2a2a0 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
2a2b0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
2a2c0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
2a2d0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
2a2e0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
2a2f0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
2a300 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d  0;.    zBuf[j+1]
2a310 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 0;.  }while( 
2a320 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29  osAccess(zBuf,0)
2a330 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2a340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
2a350 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2a360 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2a370 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a380 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
2a390 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
2a3a0 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
2a3b0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
2a3c0 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
2a3d0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
2a3e0 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
2a3f0 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
2a400 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
2a410 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
2a420 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
2a430 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
2a440 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
2a450 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2a460 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
2a470 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
2a480 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
2a490 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
2a4a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
2a4b0 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
2a4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
2a4d0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
2a4e0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
2a4f0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
2a500 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
2a510 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
2a520 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
2a530 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
2a540 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
2a550 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
2a560 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2a570 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2a580 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
2a590 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
2a5a0 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
2a5b0 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
2a5c0 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
2a5d0 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
2a5e0 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
2a5f0 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
2a600 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
2a610 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
2a620 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
2a630 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
2a640 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
2a650 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
2a660 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
2a670 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
2a680 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
2a690 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
2a6a0 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
2a6b0 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
2a6c0 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
2a6d0 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
2a6e0 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
2a6f0 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
2a700 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
2a710 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
2a720 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2a730 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
2a740 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2a750 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
2a760 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
2a770 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
2a780 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2a790 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
2a7a0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
2a7b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2a7c0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
2a7d0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2a7e0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
2a7f0 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
2a800 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2a810 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
2a820 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
2a830 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
2a840 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
2a850 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
2a860 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
2a870 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
2a880 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
2a890 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
2a8a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
2a8b0 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
2a8c0 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
2a8d0 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
2a8e0 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
2a8f0 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
2a900 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
2a910 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
2a920 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
2a930 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
2a940 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2a950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a960 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
2a970 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
2a980 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2a990 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2a9a0 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2a9b0 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2a9c0 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2a9d0 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2a9e0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2a9f0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2aa00 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2aa10 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2aa20 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2aa30 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2aa40 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2aa50 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2aa60 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2aa70 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2aa80 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2aa90 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2aaa0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2aab0 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2aac0 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2aad0 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2aae0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2aaf0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2ab00 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2ab10 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2ab20 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2ab30 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2ab40 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c  g for a resusabl
2ab50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2ab60 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
2ab70 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53   */.  if( 0==osS
2ab80 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61  tat(zPath, &sSta
2ab90 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e  t) ){.    unixIn
2aba0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
2abb0 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ..    unixEnterM
2abc0 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f  utex();.    pIno
2abd0 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
2abe0 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
2abf0 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
2ac00 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
2ac10 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2ac30 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
2ac40 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
2ac50 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
2ac60 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
2ac70 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2ac80 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
2ac90 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
2aca0 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
2acb0 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
2acc0 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
2acd0 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
2ace0 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
2acf0 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
2ad00 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
2ad10 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2ad20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
2ad30 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
2ad40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2ad50 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2ad60 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
2ad70 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2ad80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2ad90 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sed;.}../*.** Th
2ada0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2adb0 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65  alled by unixOpe
2adc0 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  n() to determine
2add0 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73   the unix permis
2ade0 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61  sions.** to crea
2adf0 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74  te new files wit
2ae00 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  h. If no error o
2ae10 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2ae20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2ae30 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65  d.** and a value
2ae40 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61   suitable for pa
2ae50 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69  ssing as the thi
2ae60 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  rd argument to o
2ae70 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69  pen(2) is.** wri
2ae80 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20  tten to *pMode. 
2ae90 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2aea0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
2aeb0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
2aec0 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
2aed0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d  the value of *pM
2aee0 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66  ode is not modif
2aef0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f  ied..**.** In mo
2af00 73 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20  st cases cases, 
2af10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
2af20 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77  s *pMode to 0, w
2af30 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
2af40 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f  .** an indicatio
2af50 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e  n to robust_open
2af60 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  () to create the
2af70 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53   file using.** S
2af80 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2af90 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61  LE_PERMISSIONS a
2afa0 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75  djusted by the u
2afb0 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20  mask..** But if 
2afc0 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2afd0 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
2afe0 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
2aff0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
2b000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
2b010 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
2b020 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
2b030 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
2b040 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
2b050 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2b060 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
2b070 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
2b080 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
2b090 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
2b0a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
2b0b0 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
2b0c0 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
2b0d0 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
2b0e0 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
2b0f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2b100 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
2b110 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
2b120 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2b130 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
2b140 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
2b150 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
2b160 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
2b170 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
2b180 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
2b190 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
2b1a0 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
2b1b0 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
2b1c0 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
2b1d0 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
2b1e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2b1f0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2b200 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2b210 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2b220 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
2b230 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
2b240 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
2b250 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b270 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
2b280 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
2b290 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
2b2a0 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
2b2d0 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
2b2e0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64  le with */.  uid
2b2f0 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b310 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20  OUT: uid to set 
2b320 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
2b330 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20   /* OUT: gid to 
2b360 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  set on the file 
2b370 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2b380 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b390 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2b3a0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
2b3b0 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20  de = 0;.  *pUid 
2b3c0 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30  = 0;.  *pGid = 0
2b3d0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2b3e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2b3f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2b400 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2b410 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
2b420 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
2b430 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2b440 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2b450 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2b460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b470 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2b480 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20  tes in zDb */.  
2b490 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2b4a0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2b4b0 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2b4c0 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2b4d0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
2b4e0 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2b4f0 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2b500 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2b510 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2b520 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2b530 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2b540 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2b550 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2b560 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2b570 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2b580 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2b590 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2b5a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2b5b0 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2b5c0 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2b5d0 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2b5e0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2b5f0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2b600 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2b610 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2b620 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2b630 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2b640 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2b650 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2b660 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2b670 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2b680 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2b690 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2b6a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2b6b0 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2b6c0 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
2b6d0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2b6e0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
2b6f0 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  0 && sqlite3Isal
2b700 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20  num(zPath[nDb]) 
2b710 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28  ) nDb--;.    if(
2b720 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
2b730 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74  [nDb]!='-' ) ret
2b740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2b750 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
2b760 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2b770 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b780 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
2b790 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44  assert( zPath[nD
2b7a0 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20  b]!='\n' );.    
2b7b0 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23    nDb--;.    }.#
2b7c0 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79  endif.    memcpy
2b7d0 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
2b7e0 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
2b7f0 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28  = '\0';..    if(
2b800 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20   0==osStat(zDb, 
2b810 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2b820 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
2b830 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
2b840 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53        *pUid = sS
2b850 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20  tat.st_uid;.    
2b860 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e    *pGid = sStat.
2b870 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73  st_gid;.    }els
2b880 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2b890 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2b8a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2b8b0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2b8c0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2b8d0 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
2b8e0 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a  ode = 0600;.  }.
2b8f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b900 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
2b910 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
2b920 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
2b930 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
2b940 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
2b950 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
2b960 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
2b970 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
2b980 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
2b990 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2b9a0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
2b9b0 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2b9c0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2b9d0 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
2b9e0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
2b9f0 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
2ba00 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
2ba10 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2ba20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
2ba30 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
2ba40 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
2ba50 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
2ba60 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
2ba70 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
2ba80 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
2ba90 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
2baa0 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
2bab0 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
2bac0 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
2bad0 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
2bae0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
2baf0 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
2bb00 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
2bb10 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
2bb20 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2bb30 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
2bb40 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
2bb50 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
2bb60 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
2bb70 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
2bb80 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
2bb90 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
2bba0 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
2bbb0 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
2bbc0 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
2bbd0 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
2bbe0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
2bbf0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2bc00 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2bc10 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
2bc20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
2bc30 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
2bc40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2bc50 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2bc60 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
2bc70 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
2bc80 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2bc90 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
2bca0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
2bcb0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2bcc0 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
2bcd0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bcf0 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
2bd00 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
2bd10 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
2bd20 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
2bd30 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2bd40 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
2bd50 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
2bd60 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
2bd70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2bd80 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
2bd90 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
2bda0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2bdb0 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
2bdc0 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
2bdd0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2bde0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2bdf0 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2be00 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
2be10 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
2be20 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
2be30 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
2be40 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2be50 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
2be60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2be70 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
2be80 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
2be90 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2bea0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2beb0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
2bec0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2bed0 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20  int ctrlFlags = 
2bee0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2bef0 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61  * UNIXFILE_* fla
2bf00 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  gs */..  int isE
2bf10 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
2bf20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2bf30 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
2bf40 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
2bf50 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2bf60 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2bf70 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
2bf80 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
2bf90 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2bfa0 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
2bfb0 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
2bfc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2bfd0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2bfe0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
2bff0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2c000 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2c010 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  TE);.#if SQLITE_
2c020 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c030 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74  TYLE.  int isAut
2c040 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73  oProxy  = (flags
2c050 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   & SQLITE_OPEN_A
2c060 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69  UTOPROXY);.#endi
2c070 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
2c080 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2c090 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c0a0 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
2c0b0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2c0c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2c0d0 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
2c0e0 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
2c0f0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
2c100 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
2c110 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
2c120 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
2c130 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
2c140 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
2c150 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
2c160 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
2c170 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2c180 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
2c190 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
2c1a0 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  )d..  */.  int s
2c1b0 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61  yncDir = (isCrea
2c1c0 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2c1d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2c1e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2c1f0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2c200 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2c210 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2c220 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2c230 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2c240 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2c250 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2c260 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2c270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2c280 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2c290 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2c2a0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2c2b0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2c2c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2c2d0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2c2e0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2c2f0 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
2c300 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2c310 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2c320 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2c330 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
2c340 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
2c350 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
2c360 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
2c370 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
2c380 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
2c390 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
2c3a0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
2c3b0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
2c3c0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2c3d0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
2c3e0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
2c3f0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2c400 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2c410 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
2c420 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
2c430 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2c440 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2c450 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
2c460 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
2c470 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2c480 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
2c490 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
2c4a0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
2c4b0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
2c4c0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
2c4d0 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
2c4e0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
2c4f0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
2c500 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
2c510 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
2c520 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
2c530 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
2c540 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
2c550 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
2c560 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2c570 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
2c580 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
2c590 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
2c5a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
2c5b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2c5c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2c5d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2c5e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2c5f0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2c600 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2c610 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2c620 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2c630 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2c640 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2c650 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2c660 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
2c670 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2c680 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2c690 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2c6a0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
2c6b0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
2c6c0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
2c6d0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
2c6e0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
2c6f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
2c700 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2c710 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
2c720 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2c730 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
2c740 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2c750 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2c760 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
2c770 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2c780 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
2c790 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2c7a0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2c7b0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
2c7c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2c7d0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2c7e0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2c7f0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
2c800 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
2c810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2c820 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
2c830 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2c840 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2c850 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2c860 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2c870 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2c880 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2c890 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2c8a0 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2c8b0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2c8c0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2c8d0 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2c8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c8f0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2c900 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2c910 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2c920 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2c930 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c940 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c960 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2c970 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
2c980 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
2c990 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
2c9a0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
2c9b0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
2c9c0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
2c9d0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
2c9e0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
2c9f0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
2ca00 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
2ca10 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2ca20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2ca30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2ca40 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
2ca50 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2ca60 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
2ca70 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
2ca80 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
2ca90 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
2caa0 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
2cab0 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
2cac0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
2cad0 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
2cae0 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63  syncDir);.    rc
2caf0 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
2cb00 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me(MAX_PATHNAME+
2cb10 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  2, zTmpname);.  
2cb20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cb30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2cb40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cb50 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
2cb60 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  me;..    /* Gene
2cb70 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20  rated temporary 
2cb80 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c  filenames are al
2cb90 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f  ways double-zero
2cba0 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
2cbb0 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71  ** for use by sq
2cbc0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2cbd0 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2cbe0 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c  sert( zName[strl
2cbf0 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2cc00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  );.  }..  /* Det
2cc10 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
2cc20 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
2cc30 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
2cc40 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
2cc50 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
2cc60 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
2cc70 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
2cc80 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
2cc90 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
2cca0 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
2ccb0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
2ccc0 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
2ccd0 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
2cce0 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
2ccf0 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
2cd00 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
2cd10 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2cd20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2cd30 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
2cd40 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
2cd50 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
2cd60 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
2cd70 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
2cd80 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
2cd90 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
2cda0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2cdb0 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
2cdc0 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
2cdd0 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
2cde0 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
2cdf0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
2ce00 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
2ce10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
2ce20 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
2ce30 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
2ce40 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20      uid_t uid;  
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20    /* Userid for 
2ce70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2ce80 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20  gid_t gid;      
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cea0 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65   Groupid for the
2ceb0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
2cec0 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2ced0 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2cee0 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75  s, &openMode, &u
2cef0 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69  id, &gid);.    i
2cf00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cf10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2cf20 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2cf30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2cf40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2cf50 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2cf60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2cf70 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2cf80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cf90 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2cfa0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2cfb0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2cfc0 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2cfd0 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2cfe0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2cff0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2d000 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
2d010 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
2d020 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
2d030 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
2d040 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  ){.      /* Fail
2d050 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
2d060 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
2d070 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
2d080 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
2d090 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
2d0a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2d0b0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2d0c0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f  CREATE);.      o
2d0d0 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
2d0e0 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
2d0f0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
2d100 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d110 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  LY;.      openFl
2d120 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
2d130 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
2d140 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20  y = 1;.      fd 
2d150 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2d160 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2d170 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
2d180 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2d190 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2d1a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2d1b0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2d1c0 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
2d1d0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2d1e0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a  inished;.    }..
2d1f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
2d200 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
2d210 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66  g as root and if
2d220 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
2d230 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2d240 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66  journal or WAL f
2d250 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e  ile, set the own
2d260 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f  ership of the jo
2d270 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20  urnal or WAL to 
2d280 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  be.    ** the sa
2d290 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  me as the origin
2d2a0 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  al database..   
2d2b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
2d2c0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
2d2d0 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
2d2e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
2d2f0 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  {.      osFchown
2d300 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
2d310 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2d320 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
2d330 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
2d340 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
2d350 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2d360 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
2d370 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2d380 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
2d390 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
2d3a0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
2d3b0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
2d3c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2d3d0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
2d3e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  ;.#else.    osUn
2d3f0 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
2d400 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
2d410 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d420 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
2d430 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
2d440 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
2d450 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f  }.#endif..  noLo
2d460 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49  ck = eType!=SQLI
2d470 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b  TE_OPEN_MAIN_DB;
2d480 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  ..  .#if defined
2d490 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
2d4a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2d4b0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
2d4c0 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
2d4d0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2d4e0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2d4f0 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
2d500 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f   = errno;.    ro
2d510 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2d520 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2d530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2d540 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
2d550 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2d560 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
2d570 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2d580 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2d590 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2d5a0 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2d5b0 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2d5c0 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
2d5d0 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
2d5e0 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
2d5f0 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
2d600 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
2d610 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2d620 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2d630 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
2d640 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
2d650 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2d660 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
2d670 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20  .  if( noLock ) 
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d690 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2d6a0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2d6b0 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20   if( syncDir )  
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2d6d0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2d6e0 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2d6f0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2d700 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74  TE_OPEN_URI ) ct
2d710 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2d720 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51  ILE_URI;..#if SQ
2d730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2d740 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
2d750 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2d760 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
2d770 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
2d780 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
2d790 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
2d7a0 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
2d7b0 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
2d7c0 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
2d7d0 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
2d7e0 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
2d7f0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
2d800 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
2d810 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
2d820 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2d830 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
2d840 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
2d850 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
2d860 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
2d870 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
2d880 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
2d890 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
2d8a0 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
2d8b0 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
2d8c0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
2d8d0 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
2d8e0 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
2d8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2d900 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
2d910 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2d920 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
2d930 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
2d940 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
2d950 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
2d960 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
2d970 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
2d980 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
2d990 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2d9a0 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
2d9b0 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
2d9c0 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
2d9d0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
2d9e0 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
2d9f0 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
2da00 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2da10 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
2da20 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
2da30 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
2da40 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
2da50 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
2da60 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
2da70 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
2da80 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
2da90 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
2daa0 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
2dab0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2dac0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
2dad0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
2dae0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2daf0 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
2db00 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
2db10 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
2db20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2db30 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2db40 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2db50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2db60 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2db70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
2db80 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2db90 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
2dba0 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
2dbb0 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
2dbc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2dbd0 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
2dbe0 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
2dbf0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2dc00 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2dc10 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
2dc20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dc30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2dc40 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2dc50 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2dc60 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2dc70 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2dc80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dc90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2dca0 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2dcb0 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2dcc0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2dcd0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2dce0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2dcf0 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2dd00 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2dd10 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2dd20 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2dd30 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2dd40 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2dd50 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2dd60 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2dd70 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2dd80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2dd90 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2dda0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2ddb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2ddc0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2ddd0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2dde0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2ddf0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2de00 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2de10 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2de20 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
2de30 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
2de40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2de50 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2de60 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
2de70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2de80 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
2de90 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
2dea0 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
2deb0 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
2dec0 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
2ded0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
2dee0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
2def0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
2df00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
2df10 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
2df20 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
2df30 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
2df40 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
2df50 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
2df60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2df70 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
2df80 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
2df90 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2dfa0 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
2dfb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2dfc0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
2dfd0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
2dfe0 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
2dff0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e000 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
2e010 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2e020 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2e030 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
2e040 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2e050 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
2e060 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
2e070 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  ){.    if( errno
2e080 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  ==ENOENT ){.    
2e090 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2e0a0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
2e0b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e0c0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2e0d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2e0e0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
2e0f0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
2e100 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
2e110 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
2e120 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2e130 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
2e140 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
2e150 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
2e160 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
2e170 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
2e180 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e190 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f  TE_OK ){.#if OS_
2e1a0 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66  VXWORKS.      if
2e1b0 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20  ( fsync(fd)==-1 
2e1c0 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  ).#else.      if
2e1d0 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65  ( fsync(fd) ).#e
2e1e0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
2e1f0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2e200 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2e210 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
2e220 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
2e230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
2e240 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
2e250 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2e260 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2e270 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2e280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2e290 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2e2a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2e2b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2e2c0 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
2e2d0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
2e2e0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
2e2f0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
2e300 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
2e310 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
2e320 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
2e330 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2e340 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
2e350 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2e360 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
2e370 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2e380 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
2e390 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
2e3a0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
2e3b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
2e3c0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
2e3d0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
2e3e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
2e3f0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
2e400 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
2e410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2e420 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
2e430 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2e440 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
2e450 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2e460 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
2e470 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2e480 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
2e490 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
2e4a0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
2e4b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2e4c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
2e4d0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
2e4e0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
2e4f0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
2e500 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
2e510 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2e520 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
2e530 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2e540 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
2e550 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2e560 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
2e570 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2e580 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2e590 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
2e5a0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
2e5b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2e5c0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
2e5d0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
2e5e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e5f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2e600 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
2e610 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
2e620 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
2e630 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2e640 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2e650 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
2e660 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2e670 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
2e680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
2e690 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
2e6a0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
2e6b0 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
2e6c0 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
2e6d0 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
2e6e0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
2e6f0 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
2e700 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
2e710 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2e720 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2e730 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
2e740 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
2e750 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
2e760 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2e770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e780 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
2e790 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
2e7a0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
2e7b0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
2e7c0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
2e7d0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
2e7e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2e7f0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
2e800 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
2e810 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
2e820 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
2e830 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
2e840 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
2e850 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
2e860 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
2e870 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
2e880 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
2e890 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
2e8a0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
2e8b0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
2e8c0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
2e8d0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
2e8e0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2e8f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2e900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2e910 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2e920 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2e930 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2e940 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2e950 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2e960 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2e970 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
2e980 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2e990 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2e9a0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2e9b0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
2e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e9d0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2e9e0 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
2e9f0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2ea00 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2ea10 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2ea20 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2ea30 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2ea40 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2ea50 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2ea60 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2ea70 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2ea80 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2ea90 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2eaa0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2eab0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2eac0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2ead0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2eae0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2eaf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2eb00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2eb10 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
2eb20 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
2eb30 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
2eb40 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
2eb50 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
2eb60 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
2eb70 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
2eb80 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
2eb90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2eba0 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
2ebb0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2ebc0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
2ebd0 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  wd;.    if( osGe
2ebe0 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
2ebf0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
2ec00 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
2ec10 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2ec20 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
2ec30 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
2ec40 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
2ec50 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
2ec60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2ec70 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
2ec80 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
2ec90 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
2eca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ecb0 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
2ecc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2ecd0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
2ece0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
2ecf0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
2ed00 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
2ed10 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
2ed20 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
2ed30 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
2ed40 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
2ed50 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
2ed60 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
2ed70 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
2ed80 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
2ed90 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2eda0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2edb0 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
2edc0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2edd0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
2ede0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
2edf0 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
2ee00 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
2ee10 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
2ee20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
2ee30 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
2ee40 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
2ee50 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
2ee60 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
2ee70 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
2ee80 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
2ee90 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
2eea0 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
2eeb0 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
2eec0 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
2eed0 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
2eee0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
2eef0 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
2ef00 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
2ef10 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
2ef20 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
2ef30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
2ef40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2ef50 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
2ef60 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2ef70 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2ef80 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
2ef90 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
2efa0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2efb0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
2efc0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2efd0 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
2efe0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
2eff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2f000 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
2f010 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
2f020 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2f030 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
2f040 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
2f050 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
2f060 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2f070 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
2f080 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
2f090 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
2f0a0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
2f0b0 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
2f0c0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
2f0d0 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
2f0e0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
2f0f0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2f100 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
2f110 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
2f120 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
2f130 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
2f140 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
2f150 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2f160 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
2f170 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
2f180 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
2f190 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
2f1a0 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
2f1b0 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
2f1c0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
2f1d0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2f1e0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
2f1f0 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
2f200 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
2f210 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
2f220 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2f230 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
2f240 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
2f250 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
2f260 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
2f270 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
2f280 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
2f290 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
2f2a0 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
2f2b0 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
2f2c0 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
2f2d0 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
2f2e0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
2f2f0 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
2f300 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
2f310 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
2f320 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
2f330 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
2f340 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
2f350 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
2f360 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
2f370 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
2f380 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
2f390 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
2f3a0 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
2f3b0 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
2f3c0 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
2f3d0 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
2f3e0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
2f3f0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2f400 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
2f410 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2f420 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
2f430 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
2f440 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2f450 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
2f460 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
2f470 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2f480 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
2f490 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2f4a0 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
2f4b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2f4c0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2f4d0 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
2f4e0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
2f4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2f500 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
2f510 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
2f520 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
2f530 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2f540 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
2f550 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
2f560 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2f570 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
2f580 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
2f590 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
2f5a0 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
2f5b0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
2f5c0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2f5d0 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
2f5e0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
2f5f0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2f600 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2f610 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f620 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2f630 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
2f640 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
2f650 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
2f660 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
2f670 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2f680 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
2f690 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
2f6a0 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
2f6b0 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
2f6c0 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
2f6d0 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
2f6e0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
2f6f0 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
2f700 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
2f710 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
2f720 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
2f730 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
2f740 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
2f750 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
2f760 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
2f770 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
2f780 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
2f790 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
2f7a0 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
2f7b0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
2f7c0 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
2f7d0 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
2f7e0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
2f7f0 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
2f800 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
2f810 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
2f820 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
2f830 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
2f840 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
2f850 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
2f860 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
2f870 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
2f880 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
2f890 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
2f8a0 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
2f8b0 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
2f8c0 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
2f8d0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
2f8e0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2f8f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2f900 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
2f910 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67    int pid, fd, g
2f920 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  ot;.    fd = rob
2f930 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75  ust_open("/dev/u
2f940 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
2f950 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
2f960 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
2f970 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
2f980 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
2f990 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69  cpy(zBuf, &t, si
2f9a0 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20  zeof(t));.      
2f9b0 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  pid = getpid();.
2f9c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
2f9d0 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
2f9e0 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
2f9f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2fa00 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f   sizeof(t)+sizeo
2fa10 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29  f(pid)<=(size_t)
2fa20 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42  nBuf );.      nB
2fa30 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b  uf = sizeof(t) +
2fa40 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
2fa50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
2fa60 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
2fa70 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
2fa80 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
2fa90 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
2faa0 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
2fab0 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
2fac0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NE__);.    }.  }
2fad0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2fae0 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
2faf0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
2fb00 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
2fb10 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
2fb20 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
2fb30 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
2fb40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2fb50 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
2fb60 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
2fb70 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2fb80 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2fb90 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
2fba0 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
2fbb0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
2fbc0 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
2fbd0 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
2fbe0 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
2fbf0 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
2fc00 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
2fc10 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
2fc20 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
2fc30 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
2fc40 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2fc50 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
2fc60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2fc70 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
2fc80 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
2fc90 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2fca0 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
2fcb0 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
2fcc0 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
2fcd0 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
2fce0 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
2fcf0 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
2fd00 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
2fd10 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
2fd20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2fd30 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2fd40 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
2fd50 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
2fd60 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
2fd70 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
2fd80 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64  leep(microsecond
2fd90 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
2fda0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2fdb0 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
2fdc0 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
2fdd0 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
2fde0 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
2fdf0 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
2fe00 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
2fe10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2fe20 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2fe30 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
2fe40 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  0000;.#endif.}..
2fe50 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2fe60 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
2fe70 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
2fe80 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
2fe90 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
2fea0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
2feb0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
2fec0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
2fed0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
2fee0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
2fef0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
2ff00 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
2ff10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2ff20 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
2ff30 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
2ff40 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
2ff50 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
2ff60 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
2ff70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
2ff80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2ff90 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2ffa0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2ffb0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
2ffc0 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
2ffd0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2ffe0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2fff0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
30000 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
30010 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
30020 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
30030 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
30040 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
30050 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
30060 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
30070 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
30080 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
30090 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
300a0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
300b0 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
300c0 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
300d0 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
300e0 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
300f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
30100 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
30110 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
30120 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
30130 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
30140 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
30150 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
30160 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
30170 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74   *piNow){.  stat
30180 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
30190 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
301a0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
301b0 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
301c0 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  00;.  int rc = S
301d0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65  QLITE_OK;.#if de
301e0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
301f0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
30200 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
30210 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
30220 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e  t64)t)*1000 + un
30230 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
30240 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
30250 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
30260 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
30270 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
30280 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
30290 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
302a0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
302b0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
302c0 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
302d0 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
302e0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
302f0 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74  sNow;.  if( gett
30300 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
30310 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69  0)==0 ){.    *pi
30320 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
30330 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
30340 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
30350 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
30360 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  /1000;.  }else{.
30370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30380 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
30390 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
303a0 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
303b0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
303c0 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
303d0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
303e0 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
303f0 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
30400 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
30410 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
30420 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30440 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
30450 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
30460 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
30470 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
30480 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
30490 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
304a0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
304b0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
304c0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
304d0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
304e0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
304f0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
30500 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
30510 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
30520 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
30530 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
30540 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
30550 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
30560 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
30570 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
30580 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
30590 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
305a0 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
305b0 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
305c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
305d0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
305e0 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
305f0 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
30600 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
30610 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
30620 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
30630 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
30640 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
30650 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
30660 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
30670 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
30680 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
30690 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
306a0 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
306b0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
306c0 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
306d0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
306e0 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
306f0 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
30700 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
30710 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
30720 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
30730 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
30740 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
30750 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
30760 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
30770 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30780 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30790 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
307a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
307b0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
307c0 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
307d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307e0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
307f0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
30800 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
30810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
30820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
30870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
308a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
308b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
308c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
308d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
308e0 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
308f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
30910 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
30920 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
30930 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
30940 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
30950 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
30960 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
30970 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
30980 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
30990 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
309a0 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
309b0 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
309c0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
309d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
309e0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
309f0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
30a00 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
30a10 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
30a20 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
30a30 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
30a40 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
30a50 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
30a60 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
30a70 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
30a80 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
30a90 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
30aa0 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
30ab0 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
30ac0 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
30ad0 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
30ae0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
30af0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
30b00 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
30b10 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
30b20 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
30b30 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
30b40 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
30b50 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
30b60 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
30b70 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
30b80 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
30b90 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
30ba0 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
30bb0 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
30bc0 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
30bd0 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
30be0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
30bf0 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
30c00 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
30c10 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
30c20 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
30c30 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
30c40 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
30c50 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
30c60 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
30c70 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
30c80 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
30c90 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
30ca0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
30cb0 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
30cc0 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
30cd0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
30ce0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
30cf0 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
30d00 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
30d10 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
30d20 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
30d30 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
30d40 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
30d50 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
30d60 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
30d70 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
30d80 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
30d90 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
30da0 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
30db0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
30dc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
30dd0 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
30de0 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
30df0 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
30e00 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
30e10 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
30e20 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
30e30 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
30e40 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
30e50 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
30e60 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
30e70 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
30e80 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
30e90 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
30ea0 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
30eb0 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
30ec0 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
30ed0 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
30ee0 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
30ef0 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
30f00 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
30f10 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
30f20 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
30f30 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
30f40 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
30f50 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
30f60 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
30f70 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
30f80 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
30f90 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
30fa0 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
30fb0 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
30fc0 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
30fd0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
30fe0 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
30ff0 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
31000 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
31010 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
31020 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
31030 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
31040 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
31050 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
31060 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
31070 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
31080 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
31090 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
310a0 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
310b0 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
310c0 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
310d0 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
310e0 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
310f0 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
31100 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
31110 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
31120 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
31130 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
31140 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
31150 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
31160 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
31170 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
31180 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
31190 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
311a0 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
311b0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
311c0 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
311d0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
311e0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
311f0 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
31200 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
31210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
31220 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
31230 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
31240 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
31250 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
31260 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31280 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
31290 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
312a0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
312b0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
312c0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
312d0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
312e0 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
312f0 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
31300 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
31310 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
31320 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
31330 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
31340 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
31350 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
31360 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
31370 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
31380 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
31390 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
313a0 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
313b0 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
313c0 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
313d0 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
313e0 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
313f0 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
31400 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
31410 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
31420 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
31430 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
31440 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
31450 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
31460 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
31470 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
31480 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
31490 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
314a0 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
314b0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
314c0 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
314d0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
314e0 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
314f0 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
31500 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
31510 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
31520 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
31530 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
31540 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
31550 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
31560 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
31570 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
31580 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
31590 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
315a0 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
315b0 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
315c0 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
315d0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
315e0 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
315f0 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
31600 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
31610 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
31620 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
31630 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
31640 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
31650 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
31660 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
31670 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
31680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
31690 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
316a0 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
316b0 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
316c0 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
316d0 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
316e0 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
316f0 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
31700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31710 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
31720 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
31730 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
31740 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
31750 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
31760 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
31770 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
31780 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
31790 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
317a0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
317b0 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
317c0 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
317d0 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
317e0 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
317f0 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
31800 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
31810 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
31820 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
31830 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
31840 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
31850 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
31860 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
31870 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
31880 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
31890 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
318a0 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
318b0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
318c0 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
318d0 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
318e0 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
318f0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
31900 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
31910 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
31920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31930 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
31940 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
31950 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
31960 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
31970 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
31980 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
31990 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
319a0 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
319b0 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
319c0 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
319d0 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
319e0 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
319f0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
31a00 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
31a10 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
31a20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
31a30 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
31a40 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
31a50 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
31a60 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
31a70 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
31a80 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
31a90 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
31aa0 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
31ab0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
31ac0 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
31ad0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
31ae0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
31af0 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
31b00 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
31b10 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
31b20 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
31b30 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
31b40 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
31b50 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
31b60 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
31b70 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
31b80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31b90 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
31ba0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
31bb0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
31bc0 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
31bd0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
31be0 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
31bf0 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
31c00 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
31c10 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
31c20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
31c30 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
31c40 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
31c50 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
31c60 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
31c70 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
31c80 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
31c90 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
31ca0 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
31cb0 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
31cc0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
31cd0 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
31ce0 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
31cf0 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
31d00 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
31d10 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
31d20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
31d30 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
31d40 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
31d50 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
31d60 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
31d70 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
31d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
31d90 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
31da0 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
31db0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
31dc0 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
31dd0 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
31de0 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
31df0 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
31e00 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
31e10 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
31e20 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
31e30 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
31e40 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
31e50 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
31e60 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
31e70 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
31e80 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
31e90 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
31ea0 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
31eb0 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
31ec0 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
31ed0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
31ee0 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
31ef0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
31f00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
31f10 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
31f20 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
31f30 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
31f40 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
31f50 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
31f60 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
31f70 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
31f80 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
31f90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
31fa0 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
31fb0 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
31fc0 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
31fd0 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
31fe0 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
31ff0 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
32000 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
32010 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
32020 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
32030 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
32040 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
32050 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
32060 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
32070 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
32080 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
32090 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
320a0 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
320b0 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
320c0 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
320d0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
320e0 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
320f0 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
32100 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
32110 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
32120 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
32130 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
32140 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
32150 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
32160 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
32170 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
32180 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
32190 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
321a0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
321b0 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
321c0 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
321d0 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
321e0 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
321f0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
32200 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
32210 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
32220 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
32230 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
32240 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
32250 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
32260 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
32270 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
32280 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
32290 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
322a0 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
322b0 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
322c0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
322d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
322e0 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
322f0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
32300 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
32310 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
32320 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
32330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
32340 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
32350 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
32360 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
32370 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
32380 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
32390 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
323a0 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
323b0 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
323c0 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
323d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
323e0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
323f0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
32400 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
32410 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
32420 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
32430 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
32440 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
32450 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
32460 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32470 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
32480 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
32490 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
324a0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
324b0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
324c0 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
324d0 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
324e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
324f0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
32500 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32520 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
32530 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
32540 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
32550 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
32560 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
32570 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
32580 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
32590 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
325a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
325b0 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
325c0 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
325d0 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
325e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
325f0 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
32600 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
32610 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
32620 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
32630 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
32640 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
32650 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
32660 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
32670 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
32680 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
32690 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
326a0 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
326b0 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
326c0 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
326d0 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
326e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
326f0 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
32700 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
32710 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
32720 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
32730 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
32740 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
32750 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
32760 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
32770 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
32780 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
32790 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
327a0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
327b0 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
327c0 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
327d0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
327e0 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
327f0 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
32800 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
32810 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
32820 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
32830 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
32840 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
32850 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
32860 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32870 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
32880 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
32890 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
328a0 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
328b0 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
328c0 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
328d0 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
328e0 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
328f0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
32900 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
32910 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
32920 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
32930 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
32940 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
32950 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
32960 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
32970 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
32980 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
32990 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
329a0 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
329b0 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
329c0 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
329d0 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
329e0 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
329f0 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
32a00 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
32a10 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
32a20 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
32a30 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
32a40 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
32a50 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
32a60 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
32a70 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
32a80 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
32a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
32ab0 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
32ac0 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
32ad0 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
32ae0 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
32af0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32b00 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
32b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
32b20 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
32b30 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
32b40 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
32b50 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
32b60 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
32b70 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
32b80 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
32b90 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
32ba0 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
32bb0 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
32bc0 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
32bd0 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
32be0 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
32bf0 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
32c00 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
32c10 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
32c20 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
32c30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
32c40 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
32c50 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
32c60 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
32c70 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
32c80 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
32c90 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
32ca0 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
32cb0 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
32cc0 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
32cd0 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
32ce0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
32cf0 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
32d00 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
32d10 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
32d20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
32d30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
32d40 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
32d50 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
32d60 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
32d70 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
32d80 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
32d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
32da0 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
32db0 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
32dc0 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32de0 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
32df0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
32e00 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
32e10 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
32e20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
32e30 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
32e40 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
32e50 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
32e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32e70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
32e80 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
32e90 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
32ea0 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
32eb0 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
32ec0 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
32ed0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
32ee0 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
32ef0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
32f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
32f10 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
32f20 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
32f30 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
32f40 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
32f50 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
32f60 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
32f70 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
32f80 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
32f90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
32fa0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
32fb0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
32fc0 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
32fd0 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
32fe0 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
32ff0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
33000 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
33010 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
33020 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
33030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33040 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
33050 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
33060 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
33070 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
33080 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
33090 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
330a0 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
330b0 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
330c0 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
330d0 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
330e0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
330f0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
33100 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
33110 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
33120 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
33130 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
33140 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
33150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33160 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
33170 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
33180 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
33190 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
331a0 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
331b0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
331c0 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
331d0 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
331e0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
331f0 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
33200 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
33210 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
33220 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
33230 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
33240 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
33250 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
33260 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
33270 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
33280 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
33290 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
332a0 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
332b0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
332c0 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
332d0 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
332e0 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
332f0 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
33300 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
33310 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
33320 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
33330 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
33340 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
33350 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
33360 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
33370 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
33380 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
33390 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
333a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
333b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
333c0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
333d0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
333e0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
333f0 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
33400 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
33410 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
33420 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
33430 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
33440 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
33450 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
33460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33470 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
33480 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
33490 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ags, 0);.      }
334a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
334b0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
334c0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
334d0 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  Y;.    fd = robu
334e0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
334f0 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
33500 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
33510 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
33520 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63  ){.    if( isloc
33530 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  kfile ){.      r
33540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
33550 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  Y;.    }.    swi
33560 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20  tch (terrno) {. 
33570 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53       case EACCES
33580 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
33590 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
335a0 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20      case EIO: . 
335b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
335c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
335d0 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   /* even though 
335e0 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20  it is the conch 
335f0 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  */.      default
33600 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
33610 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
33620 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
33630 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e  .  .  pNew = (un
33640 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  ixFile *)sqlite3
33650 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
33660 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
33670 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
33680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
33690 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
336a0 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
336b0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
336c0 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
336d0 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
336e0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
336f0 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
33700 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
33710 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
33720 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
33730 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
33740 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
33750 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
33760 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
33770 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
33780 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
33790 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
337a0 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
337b0 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
337c0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
337d0 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
337e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
337f0 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a  pNew, path, 0);.
33800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33810 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
33820 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
33830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33840 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
33850 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
33860 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
33870 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
33880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
33890 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
338a0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
338b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
338c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
338d0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
338e0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
338f0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
33900 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
33910 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
33920 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
33930 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
33940 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
33950 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
33960 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
33970 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
33980 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
33990 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
339a0 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
339b0 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
339c0 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
339d0 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
339e0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
339f0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
33a00 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
33a10 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
33a20 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
33a30 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
33a40 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
33a50 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
33a60 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33a70 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
33a80 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
33a90 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
33aa0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
33ab0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
33ac0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
33ad0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
33ae0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
33af0 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
33b00 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
33b10 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
33b20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
33b30 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
33b40 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
33b50 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
33b60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
33b70 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
33b80 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
33b90 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
33ba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
33bb0 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
33bc0 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
33bd0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
33be0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
33bf0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
33c00 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
33c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
33c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
33c30 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
33c40 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
33c50 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23  METER(pError);.#
33c60 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
33c70 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69  ITE_TEST.  /* si
33c80 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
33c90 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
33ca0 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
33cb0 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20  file paths */.  
33cc0 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  if( sqlite3_host
33cd0 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20  id_num != 0){.  
33ce0 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28    pHostID[0] = (
33cf0 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d  char)(pHostID[0]
33d00 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65   + (char)(sqlite
33d10 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30  3_hostid_num & 0
33d20 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xFF));.  }.#endi
33d30 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  f.  .  return SQ
33d40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
33d50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
33d60 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65  ntains the heade
33d70 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c  r, host id and l
33d80 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a  ock file path. *
33d90 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
33da0 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20  CONCHVERSION 2  
33db0 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65   /* 1-byte heade
33dc0 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20  r, 16-byte host 
33dd0 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66  id, path */.#def
33de0 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52  ine PROXY_HEADER
33df0 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f  LEN    1   /* co
33e00 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20  nch file header 
33e10 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e  length */.#defin
33e20 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  e PROXY_PATHINDE
33e30 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44  X    (PROXY_HEAD
33e40 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
33e50 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50  IDLEN).#define P
33e60 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
33e70 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
33e80 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
33e90 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a  EN+MAXPATHLEN)..
33ea0 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  /* .** Takes an 
33eb0 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c  open conch file,
33ec0 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74   copies the cont
33ed0 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61  ents to a new pa
33ee0 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  th and then move
33ef0 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20  s .** it back.  
33f00 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65  The newly create
33f10 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65  d file's file de
33f20 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69  scriptor is assi
33f30 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63  gned to the.** c
33f40 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74  onch file struct
33f50 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ure and finally 
33f60 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
33f70 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
33f80 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64  or is .** closed
33f90 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  .  Returns zero 
33fa0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
33fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33fc0 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
33fd0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33fe0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
33ff0 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  D){.  proxyLocki
34000 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
34010 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
34020 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
34030 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
34040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
34050 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
34060 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72  onchFile;.  char
34070 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45   tPath[MAXPATHLE
34080 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50  N];.  char buf[P
34090 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
340a0 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68  ];.  char *cPath
340b0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
340c0 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74  lePath;.  size_t
340d0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
340e0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
340f0 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73   0;.  char errms
34100 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e  g[64] = "";.  in
34110 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
34120 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53   rc = -1;.  UNUS
34130 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48  ED_PARAMETER(myH
34140 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72  ostID);..  /* cr
34150 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20  eate a new path 
34160 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74  by replace the t
34170 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27  railing '-conch'
34180 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a   with '-break' *
34190 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74  /.  pathLen = st
341a0 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61  rlcpy(tPath, cPa
341b0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
341c0 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d  .  if( pathLen>M
341d0 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74  AXPATHLEN || pat
341e0 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20  hLen<6 || .     
341f0 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b  (strlcpy(&tPath[
34200 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65  pathLen-5], "bre
34210 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b  ak", 6) != 5) ){
34220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
34230 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
34240 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74  msg),errmsg,"pat
34250 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
34260 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  ",(int)pathLen);
34270 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
34280 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
34290 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
342a0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
342b0 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  adLen = osPread(
342c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
342d0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
342e0 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
342f0 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
34300 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
34310 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34320 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
34330 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f  rrmsg,"read erro
34340 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
34350 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
34360 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
34370 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
34380 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
34390 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
343a0 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72  file */.  fd = r
343b0 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68  obust_open(tPath
343c0 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
343d0 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20  T|O_EXCL), 0);. 
343e0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
343f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
34400 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
34410 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
34420 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
34430 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
34440 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
34450 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
34460 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
34470 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
34480 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
34490 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
344a0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
344b0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
344c0 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
344d0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
344e0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
344f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
34500 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
34510 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
34520 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
34530 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
34540 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
34550 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
34560 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
34570 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
34580 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
34590 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
345a0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
345b0 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
345c0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
345d0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
345e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
345f0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
34600 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
34610 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
34620 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
34630 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
34640 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
34650 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  =0 ){.      osUn
34660 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
34670 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
34680 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
34690 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E__);.    }.    
346a0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
346b0 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b  "failed to break
346c0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
346d0 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c  s, %s\n", cPath,
346e0 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20   errmsg);.  }.  
346f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34700 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73   Take the reques
34710 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ted lock on the 
34720 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62  conch file and b
34730 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63  reak a stale loc
34740 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  k if the .** hos
34750 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  t id matches..*/
34760 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
34770 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  yConchLock(unixF
34780 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
34790 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74  _t myHostID, int
347a0 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72   lockType){.  pr
347b0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
347c0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
347d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
347e0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
347f0 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
34800 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
34810 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
34820 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
34830 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
34840 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75  ries = 0;.  stru
34850 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63  ct timespec conc
34860 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d  hModTime;.  .  m
34870 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54  emset(&conchModT
34880 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ime, 0, sizeof(c
34890 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20  onchModTime));. 
348a0 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63   do {.    rc = c
348b0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
348c0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
348d0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
348e0 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
348f0 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20    nTries ++;.   
34900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34910 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  BUSY ){.      /*
34920 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   If the lock fai
34930 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20  led (busy):.    
34940 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65     * 1st try: ge
34950 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f  t the mod time o
34960 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69  f the conch, wai
34970 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61  t 0.5s and try a
34980 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20  gain. .       * 
34990 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66  2nd try: fail if
349a0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68   the mod time ch
349b0 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64  anged or host id
349c0 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77   is different, w
349d0 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20  ait .       *   
349e0 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61          10 sec a
349f0 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20  nd try again.   
34a00 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62      * 3rd try: b
34a10 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e  reak the lock un
34a20 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d  less the mod tim
34a30 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20  e has changed.. 
34a40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
34a50 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
34a60 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
34a70 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
34a80 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
34a90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
34aa0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
34ab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34ac0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
34ad0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
34ae0 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20    if( nTries==1 
34af0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
34b00 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
34b10 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
34b20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
34b30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
34b40 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
34b50 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
34b60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
34b70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
34b80 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31  assert( nTries>1
34b90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
34ba0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65  nchModTime.tv_se
34bb0 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
34bc0 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20  espec.tv_sec || 
34bd0 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  .         conchM
34be0 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21  odTime.tv_nsec !
34bf0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
34c00 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20  ec.tv_nsec ){.  
34c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
34c20 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
34c30 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
34c40 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20  f( nTries==2 ){ 
34c50 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74   .        char t
34c60 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
34c70 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
34c80 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61  int len = osPrea
34c90 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
34ca0 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
34cb0 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
34cc0 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29       if( len<0 )
34cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
34ce0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
34cf0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
34d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
34d10 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
34d20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34d30 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e  len>PROXY_PATHIN
34d40 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d  DEX && tBuf[0]==
34d50 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
34d60 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20  HVERSION){.     
34d70 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
34d80 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20  eak the lock if 
34d90 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73  the host id does
34da0 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
34db0 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65         if( 0!=me
34dc0 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59  mcmp(&tBuf[PROXY
34dd0 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
34de0 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
34df0 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20  TIDLEN) ){.     
34e00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34e10 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
34e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34e40 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
34e50 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74  he lock on short
34e60 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69   read or a versi
34e70 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20  on mismatch */. 
34e80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34e90 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
34ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
34eb0 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b  sleep(10000000);
34ec0 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20   /* wait 10 sec 
34ed0 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
34ee0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
34ef0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20    continue; .   
34f00 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
34f10 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
34f20 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
34f30 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f   0==proxyBreakCo
34f40 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
34f50 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20  yHostID) ){.    
34f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34f70 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
34f80 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53  lockType==EXCLUS
34f90 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
34fa0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
34fb0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
34fc0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
34fd0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
34fe0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20  HARED_LOCK);    
34ff0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
35000 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
35010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
35020 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
35030 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
35040 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
35050 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
35060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
35080 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
35090 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
350a0 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
350b0 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
350c0 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
350d0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
350e0 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
350f0 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
35100 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
35110 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
35120 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
35130 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
35140 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
35150 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
35160 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
35170 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
35180 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
35190 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
351a0 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
351b0 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
351c0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
351d0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
351e0 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
351f0 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
35200 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
35210 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
35220 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
35230 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
35240 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
35250 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
35260 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
35270 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
35280 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
35290 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
352a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
352b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
352c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
352d0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
352e0 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
352f0 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
35300 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
35310 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
35320 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
35330 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
35340 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
35350 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
35360 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
35370 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
35380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
35390 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
353a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
353b0 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
353c0 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
353d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
353e0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
353f0 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
35400 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
35410 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28    .    OSTRACE((
35420 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
35430 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
35440 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
35450 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
35460 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35470 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
35480 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
35490 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
354a0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
354b0 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
354c0 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
354d0 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
354e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
354f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
35500 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
35510 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
35520 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
35530 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
35540 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
35550 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
35560 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
35570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35580 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
35590 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
355a0 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
355b0 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
355c0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
355d0 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
355e0 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
355f0 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
35600 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
35610 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
35620 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
35630 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
35640 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
35650 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
35660 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
35670 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
35680 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
35690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
356a0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
356b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
356c0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
356d0 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
356e0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
356f0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
35700 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
35710 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
35720 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
35730 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
35740 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
35750 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
35760 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
35770 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
35780 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
35790 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
357a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
357b0 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
357c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
357d0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
357e0 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
357f0 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
35800 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
35810 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
35820 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
35830 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
35840 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
35850 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
35860 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
35870 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
35880 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
35890 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
358a0 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
358b0 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
358c0 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
358d0 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
358e0 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
358f0 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
35900 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
35910 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
35920 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
35930 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
35940 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
35950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35970 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
35980 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
35990 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
359a0 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
359b0 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
359c0 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
359d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
359e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
359f0 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
35a00 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
35a10 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
35a20 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
35a30 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
35a40 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
35a50 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
35a60 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
35a70 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
35a80 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
35a90 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
35aa0 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
35ab0 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
35ac0 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
35ad0 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
35ae0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
35af0 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
35b00 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
35b10 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
35b20 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
35b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35b40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
35b50 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
35b60 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
35b70 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
35b80 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
35b90 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
35ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
35bb0 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
35bc0 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
35bd0 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
35be0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35bf0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
35c00 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
35c10 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
35c20 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
35c30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35c40 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
35c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35c60 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
35c70 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20  dMatch.         
35c80 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d        && !strncm
35c90 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
35ca0 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  yPath, &readBuf[
35cb0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
35cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
35ce0 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49  dLen-PROXY_PATHI
35cf0 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b  NDEX).        ){
35d00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  .          /* co
35d10 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63  nch host and loc
35d20 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a  k path match */.
35d30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
35d40 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20  nd_takeconch; . 
35d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35d60 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
35d70 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
35d80 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64  n't writable and
35d90 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20   doesn't match, 
35da0 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74  we can't take it
35db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63   */.      if( (c
35dc0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
35dd0 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
35de0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35df0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
35e00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
35e10 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
35e20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
35e30 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  * either the con
35e40 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20  ch didn't match 
35e50 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  or we need to cr
35e60 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
35e70 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74  /.      if( !pCt
35e80 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35e90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
35ea0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
35eb0 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
35ec0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
35ed0 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f  ;.        tempLo
35ee0 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
35ef0 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72  h;.        /* cr
35f00 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
35f10 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e  he lock path _on
35f20 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ly_ if the conch
35f30 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
35f40 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
35f50 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
35f60 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
35f70 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
35f80 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
35f90 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68  ocess.      ** h
35fa0 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
35fb0 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68   already), if th
35fc0 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
35fd0 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20  s, use the big. 
35fe0 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20       ** stick.. 
35ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75       */.      fu
36000 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d  times(conchFile-
36010 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  >h, NULL);.     
36020 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
36030 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68   && !createConch
36040 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
36050 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
36060 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  e && conchFile->
36070 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
36080 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
36090 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
360a0 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
360b0 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
360c0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
360d0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
360e0 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
360f0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
36100 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
36110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
36120 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
36130 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20     } else {     
36140 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
36150 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
36160 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
36170 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  tID, EXCLUSIVE_L
36180 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
36190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
361a0 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
361b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
361c0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
361d0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58  e*)conchFile, EX
361e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
361f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36210 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77  {.        char w
36220 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
36230 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
36240 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65         int write
36250 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
36260 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65    .        write
36270 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61  Buffer[0] = (cha
36280 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
36290 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65  SION;.        me
362a0 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  mcpy(&writeBuffe
362b0 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  r[PROXY_HEADERLE
362c0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
362d0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
362e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
362f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21  ->lockProxyPath!
36300 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
36310 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
36320 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
36330 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e  THINDEX], pCtx->
36340 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d  lockProxyPath, M
36350 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
36360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36370 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
36380 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
36390 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70  PATHINDEX], temp
363a0 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  LockPath, MAXPAT
363b0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
363c0 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69  .        writeSi
363d0 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49  ze = PROXY_PATHI
363e0 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77  NDEX + strlen(&w
363f0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
36400 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20  _PATHINDEX]);.  
36410 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72        robust_ftr
36420 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65  uncate(conchFile
36430 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b  ->h, writeSize);
36440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
36450 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33  ixWrite((sqlite3
36460 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c  _file *)conchFil
36470 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20  e, writeBuffer, 
36480 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20  writeSize, 0);. 
36490 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e         fsync(con
364a0 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  chFile->h);.    
364b0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65      /* If we cre
364c0 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68  ated a new conch
364d0 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20   file (not just 
364e0 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74  updated the cont
364f0 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20  ents of a .     
36500 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e      ** valid con
36510 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f  ch file), try to
36520 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69   match the permi
36530 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61  ssions of the da
36540 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20  tabase .        
36550 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
36560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36570 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a   createConch ){.
36580 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
36590 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
365a0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f       int err = o
365b0 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
365c0 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20   &buf);.        
365d0 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a    if( err==0 ){.
365e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
365f0 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73  _t cmode = buf.s
36600 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c  t_mode&(S_IRUSR|
36610 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52  S_IWUSR | S_IRGR
36620 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20  P|S_IWGRP |.    
36630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36650 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57      S_IROTH|S_IW
36660 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OTH);.          
36670 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63    /* try to matc
36680 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
36690 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69  ile R/W permissi
366a0 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c  ons, ignore fail
366b0 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ure */.#ifndef S
366c0 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
366d0 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  G.            os
366e0 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  Fchmod(conchFile
366f0 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c  ->h, cmode);.#el
36700 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  se.            d
36710 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o{.             
36720 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63   rc = osFchmod(c
36730 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
36740 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
36750 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31   }while( rc==(-1
36760 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  ) && errno==EINT
36770 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  R );.           
36780 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
36790 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
367a0 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
367b0 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
367c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
367d0 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69  mod %o FAILED wi
367e0 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  th %d %s\n",.   
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36800 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20     cmode, code, 
36810 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
36820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
36830 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
36840 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
36850 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53  rr, "fchmod %o S
36860 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65  UCCEDED\n",cmode
36870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
36880 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
36890 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
368a0 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
368b0 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
368c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41  ntf(stderr, "STA
368d0 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74  T FAILED[%d] wit
368e0 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20  h %d %s\n", .   
368f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36900 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65   err, code, stre
36910 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e  rror(code));.#en
36920 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dif.          }.
36930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36940 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c  }.      conchFil
36950 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
36960 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
36970 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
36980 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
36990 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63    .    end_takec
369a0 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52  onch:.      OSTR
369b0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
369c0 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20  : CLOSE  %d\n", 
369d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
369e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
369f0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70  _OK && pFile->op
36a00 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  enFlags ){.     
36a10 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20     int fd;.     
36a20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
36a30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
36a40 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
36a50 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
36a60 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
36a70 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65   }.        pFile
36a80 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
36a90 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
36aa0 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  en(pCtx->dbPath,
36ab0 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
36ac0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 4f  s, 0);.        O
36ad0 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
36ae0 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22  OXY: OPEN  %d\n"
36af0 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20  , fd));.        
36b00 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
36b10 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
36b20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  = fd;.        }e
36b30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
36b40 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
36b50 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54  N_BKPT; /* SQLIT
36b60 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b  E_BUSY? proxyTak
36b70 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20  eConch called.  
36b80 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20           during 
36b90 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
36ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36bb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36bc0 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c  E_OK && !pCtx->l
36bd0 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
36be0 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d      char *path =
36bf0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20   tempLockPath ? 
36c00 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70  tempLockPath : p
36c10 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36c20 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  th;.        rc =
36c30 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
36c40 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78  File(path, &pCtx
36c50 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b  ->lockProxy, 1);
36c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
36c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
36c80 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
36c90 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  & tryOldLockPath
36ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
36cb0 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65   we couldn't cre
36cc0 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  ate the proxy lo
36cd0 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ck file with the
36ce0 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   old lock file p
36cf0 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ath.           *
36d00 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76  * so try again v
36d10 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a  ia auto-naming .
36d20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
36d30 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77          forceNew
36d40 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
36d50 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
36d60 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
36d70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
36d80 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68  /* go back to th
36d90 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74  e do {} while st
36da0 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61  art point, try a
36db0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
36dc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36dd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36de0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
36df0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63  Need to make a c
36e00 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77  opy of path if w
36e10 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20  e extracted the 
36e20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a  value.         *
36e30 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68  * from the conch
36e40 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74   file or the pat
36e50 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  h was allocated 
36e60 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20  on the stack.   
36e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36e80 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74   if( tempLockPat
36e90 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  h ){.          p
36ea0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36eb0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
36ec0 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b  rDup(0, tempLock
36ed0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
36ee0 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
36ef0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
36f00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
36f10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
36f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36f30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36f40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36f50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  K ){.        pCt
36f60 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31  x->conchHeld = 1
36f70 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
36f80 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
36f90 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
36fa0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
36fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
36fc0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
36fd0 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20  *afpCtx;.       
36fe0 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70     afpCtx = (afp
36ff0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37000 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  )pCtx->lockProxy
37010 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37020 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
37030 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74  tx->dbPath = pCt
37040 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
37050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37060 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
37070 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
37080 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
37090 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
370a0 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
370b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
370c0 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
370d0 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
370e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
370f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d               rc=
37100 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a  =SQLITE_OK?"ok":
37110 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
37120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
37130 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a   } while (1); /*
37140 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
37150 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61   to retry the :a
37160 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d  uto: lock file -
37170 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
37180 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
37190 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65  never get here e
371a0 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63  xcept via the 'c
371b0 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a  ontinue' call. *
371c0 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  /.  }.}../*.** I
371d0 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
371e0 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
371f0 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
37200 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
37210 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37220 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
37230 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
37240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37250 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
37260 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
37270 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
37280 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37290 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
372a0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
372b0 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
372c0 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
372d0 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
372e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
372f0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
37300 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
37310 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37320 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37330 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
37340 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37350 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
37360 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
37370 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
37380 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
37390 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
373a0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
373b0 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
373c0 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
373d0 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
373e0 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
373f0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
37400 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72  hHeld>0 ){.    r
37410 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
37420 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
37430 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
37440 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
37450 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e  K);.  }.  pCtx->
37460 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
37470 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
37480 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  SECONCH  %d %s\n
37490 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
374a0 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
374b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
374c0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b  " : "failed")));
374d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
374e0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
374f0 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
37500 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
37510 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
37520 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
37530 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
37540 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
37550 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
37560 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
37570 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
37580 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
37590 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
375a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
375b0 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
375c0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
375d0 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
375e0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
375f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
37600 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
37610 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
37620 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
37630 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
37640 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
37650 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
37660 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
37670 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
37680 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
37690 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
376a0 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
376b0 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
376c0 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
376d0 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
376e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37700 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37710 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
37720 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
37730 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
37740 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
37750 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
37760 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
37770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37780 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
37790 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
377a0 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
377b0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
377c0 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
377d0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
377e0 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
377f0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
37800 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
37810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37820 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
37830 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
37840 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
37850 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
37860 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
37870 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
37880 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
37890 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
378a0 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
378b0 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
378c0 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
378d0 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
378e0 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
378f0 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
37900 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
37910 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
37920 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
37930 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
37940 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
37950 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
37960 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
37970 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
37980 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
37990 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
379a0 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
379b0 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
379c0 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
379d0 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
379e0 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
379f0 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
37a00 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
37a10 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
37a20 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
37a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
37a40 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
37a50 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
37a60 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
37a70 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
37a80 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
37a90 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
37aa0 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
37ab0 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
37ac0 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
37ad0 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
37ae0 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
37af0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37b00 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
37b20 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37b30 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
37b40 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
37b50 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
37b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37b70 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
37b80 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
37b90 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
37ba0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
37bb0 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
37bc0 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
37bd0 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
37be0 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
37bf0 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
37c00 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
37c10 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
37c20 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
37c30 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
37c40 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
37c50 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
37c60 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
37c70 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
37c80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
37c90 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
37ca0 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
37cb0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
37cc0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
37cd0 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
37ce0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
37cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
37d00 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
37d10 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
37d20 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
37d30 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
37d40 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
37d50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
37d60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
37d70 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
37d80 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
37d90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
37da0 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
37db0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
37dc0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
37dd0 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
37de0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
37df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20  .}../*.** pFile 
37e00 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  is a file that h
37e10 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
37e20 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20  y a prior xOpen 
37e30 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a  call.  dbPath.**
37e40 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66   is a string buf
37e50 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58  fer at least MAX
37e60 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63  PATHLEN+1 charac
37e70 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ters in size..**
37e80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37e90 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61   find the filena
37ea0 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
37eb0 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69  th pFile and wri
37ec0 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62  tes it.** int db
37ed0 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
37ee0 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61  int proxyGetDbPa
37ef0 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
37f00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
37f10 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69  har *dbPath){.#i
37f20 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
37f30 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  E__).  if( pFile
37f40 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
37f50 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
37f60 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
37f70 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
37f80 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
37f90 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
37fa0 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
37fb0 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
37fc0 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
37fd0 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
37fe0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37ff0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
38000 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
38010 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
38020 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
38030 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
38040 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41  ext)->dbPath, MA
38050 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65  XPATHLEN);.  } e
38060 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
38070 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
38080 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
38090 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
380a0 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
380b0 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
380c0 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
380d0 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
380e0 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
380f0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
38100 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
38110 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
38120 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
38130 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
38140 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
38150 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
38160 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
38170 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
38180 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
38190 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
381a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
381b0 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
381c0 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
381d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
381e0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
381f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
38200 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
38210 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
38220 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
38230 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
38240 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  xt, MAXPATHLEN);
38250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
38260 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
38270 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
38280 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
38290 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
382a0 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
382b0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
382c0 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
382d0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
382e0 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
382f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
38300 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
38310 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
38320 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
38330 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
38340 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
38350 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
38360 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
38370 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
38380 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
38390 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
383a0 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
383b0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
383c0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
383d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
383e0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
383f0 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
38400 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
38410 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
38420 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
38430 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
38440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
38450 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
38460 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
38470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
38480 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
38490 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
384a0 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
384b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
384c0 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61  }.  proxyGetDbPa
384d0 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46  thForUnixFile(pF
384e0 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  ile, dbPath);.  
384f0 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
38500 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
38510 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
38520 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63  to:") ){.    loc
38530 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65  kPath=NULL;.  }e
38540 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  lse{.    lockPat
38550 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a  h=(char *)path;.
38560 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45    }.  .  OSTRACE
38570 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  (("TRANSPROXY  %
38580 64 20 66 6f 7