/ Hex Artifact Content
Login

Artifact 55d110879332831b734fd510cfbc5700e96a83cf:


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 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
22c0: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20  int64 mmapSize; 
22d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22e0: 66 20 78 4d 72 65 6d 61 70 28 29 20 2a 2f 0a 20  f xMremap() */. 
22f0: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
2300: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2310: 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d  /* Area memory m
2320: 61 70 70 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  apped */.#endif.
2330: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2340: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2350: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2360: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2370: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2380: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
2390: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
23a0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
23b0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
23c0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
23d0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
23e0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
23f0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
2400: 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46  es for the unixF
2410: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69  ile.ctrlFlags bi
2420: 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e  tmask:.*/.#defin
2430: 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20  e UNIXFILE_EXCL 
2440: 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20         0x01     
2450: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  /* Connections f
2460: 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20  rom one process 
2470: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2480: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20  UNIXFILE_RDONLY 
2490: 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a       0x02     /*
24a0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
24b0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
24c0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  ine UNIXFILE_PER
24d0: 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20  SIST_WAL 0x04   
24e0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
24f0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e  WAL mode */.#ifn
2500: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2510: 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66  LE_DIRSYNC.# def
2520: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
2530: 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20 20  SYNC    0x08    
2540: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79   /* Directory sy
2550: 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c  nc needed */.#el
2560: 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  se.# define UNIX
2570: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
2580: 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66  0x00.#endif.#def
2590: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  ine UNIXFILE_PSO
25a0: 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20  W        0x10   
25b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
25c0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25d0: 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65  WRITE */.#define
25e0: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
25f0: 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20 2f        0x20     /
2600: 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
2610: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
2620: 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20  XFILE_URI       
2630: 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69    0x40     /* Fi
2640: 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76  lename might hav
2650: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
2660: 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  rs */.#define UN
2670: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20  IXFILE_NOLOCK   
2680: 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44     0x80     /* D
2690: 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o no file lockin
26a0: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  g */../*.** Incl
26b0: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
26c0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
26d0: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
26e0: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
26f0: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
2700: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
2710: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2720: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
2730: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
2740: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2750: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2760: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
2770: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2780: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
27c0: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
27d0: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
27e0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
27f0: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
2800: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
2810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
2820: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
2830: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
2840: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
2850: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
2860: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2870: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
2880: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2890: 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  FE.#define threa
28a0: 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66  did pthread_self
28b0: 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  ().#else.#define
28c0: 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64   threadid 0.#end
28d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72  if../*.** Differ
28e0: 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73  ent Unix systems
28f0: 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20   declare open() 
2900: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  in different way
2910: 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20  s.  Same use.** 
2920: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2930: 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f  ,int,mode_t).  O
2940: 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63  thers use open(c
2950: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e  onst char*,int,.
2960: 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..)..** The diff
2970: 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74  erence is import
2980: 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61  ant when using a
2990: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
29b0: 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74  The safest way t
29c0: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
29d0: 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c  problem is to al
29e0: 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72  ways use this wr
29f0: 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61  apper.** which a
2a00: 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61  lways has the sa
2a10: 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  me well-defined 
2a20: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
2a30: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70  atic int posixOp
2a40: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
2a50: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c  File, int flags,
2a60: 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65   int mode){.  re
2a70: 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c  turn open(zFile,
2a80: 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d   flags, mode);.}
2a90: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ../*.** On some 
2aa0: 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74  systems, calls t
2ab0: 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20  o fchown() will 
2ac0: 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67  trigger a messag
2ad0: 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a  e in a security.
2ae0: 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63  ** log if they c
2af0: 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f  ome from non-roo
2b00: 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f  t processes.  So
2b10: 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66   avoid calling f
2b20: 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65  chown() if.** we
2b30: 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67   are not running
2b40: 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61   as root..*/.sta
2b50: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63 68  tic int posixFch
2b60: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
2b70: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
2b80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65  ){.  return gete
2b90: 75 69 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f  uid() ? 0 : fcho
2ba0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
2bb0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2bc0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2bd0: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2be0: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2bf0: 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d   int*);../*.** M
2c00: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2c10: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
2c20: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
2c30: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
2c40: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
2c50: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
2c60: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
2c70: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
2c80: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
2c90: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
2ca0: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2cb0: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2cc0: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2cd0: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2ce0: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2cf0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2d00: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2d10: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
2d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2d30: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2d40: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2d50: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2d60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2d70: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
2d80: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
2d90: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2da0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2db0: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2dc0: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2dd0: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2de0: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
2df0: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
2e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e10: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
2e20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
2e30: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
2e40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2e50: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
2e60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e70: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
2e80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2e90: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
2ea0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2eb0: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
2ec0: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
2ed0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
2ee0: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
2ef0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2f00: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
2f10: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2f20: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
2f30: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2f40: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
2f50: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
2f60: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
2f70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2f80: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
2f90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2fa0: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
2fb0: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
2fc0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2fd0: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
2fe0: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
2ff0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3000: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
3010: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3020: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
3030: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3040: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
3050: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
3060: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
3070: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
3080: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
3090: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
30a0: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
30b0: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
30c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
30d0: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
30e0: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
30f0: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
3100: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
3110: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
3120: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
3130: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
3140: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
3150: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
3160: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
3170: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
3180: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3190: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
31a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
31b0: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
31c0: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
31d0: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
31e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
31f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
3200: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3210: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
3220: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
3230: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
3240: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3250: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
3260: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
3270: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3280: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
3290: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
32a0: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
32b0: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
32c0: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
32d0: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
32e0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
32f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
3300: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
3310: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
3320: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3330: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
3340: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
3350: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
3360: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3370: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
3380: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3390: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
33a0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
33b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
33c0: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
33d0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
33e0: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
33f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3400: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3410: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
3420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3430: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
3440: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3450: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
3460: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3470: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3480: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3490: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
34a0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
34b0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
34c0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34d0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
34e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
34f0: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
3500: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
3510: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3520: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
3530: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
3540: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
3550: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3560: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3570: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3580: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
3590: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
35a0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
35b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
35c0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
35d0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
35e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
35f0: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
3600: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3610: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
3620: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3630: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
3640: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
3650: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3660: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
3670: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
3680: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
3690: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
36a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
36b0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
36c0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
36d0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
36e0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
36f0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3700: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3710: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3720: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3730: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3740: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3760: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
3770: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3780: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3790: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
37a0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
37b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
37c0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
37d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
37e0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
37f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3800: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3810: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3820: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
3830: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3840: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3850: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3870: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3880: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3890: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
38a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
38b0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
38c0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
38d0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
38e0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
38f0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
3900: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
3910: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3920: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3930: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3940: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3950: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3960: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
3970: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
3980: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
3990: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
39a0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39c0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
39d0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
39e0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
39f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3a00: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
3a10: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
3a20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3a30: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
3a40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3a50: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
3a60: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3a70: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3a80: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
3a90: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
3aa0: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
3ab0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
3ac0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
3ad0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3ae0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
3af0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3b00: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
3b10: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
3b20: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
3b30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3b40: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
3b50: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3b60: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
3b70: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3b80: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
3b90: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3ba0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3bb0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
3bc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bd0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
3be0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bf0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
3c00: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3c10: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
3c20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c30: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
3c40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c50: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
3c60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c70: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
3c80: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
3c90: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
3ca0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3cb0: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
3cc0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
3cd0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
3ce0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
3cf0: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
3d00: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
3d10: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
3d20: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
3d30: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
3d40: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
3d50: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
3d60: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
3d70: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
3d80: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
3d90: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
3da0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
3db0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
3dc0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
3dd0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
3de0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
3df0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
3e00: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
3e10: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
3e20: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
3e30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3e40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
3e50: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
3e60: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
3e70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3e80: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
3e90: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
3ea0: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
3eb0: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
3ec0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
3ed0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3ee0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
3ef0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3f00: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
3f10: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
3f20: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
3f30: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
3f40: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
3f50: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
3f60: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
3f70: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
3f80: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
3f90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3fa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
3fb0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
3fc0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
3fd0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
3fe0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
3ff0: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
4000: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
4010: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
4020: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
4030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4040: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4050: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
4060: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
4070: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
4080: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
4090: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
40a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
40b0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
40c0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
40d0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
40e0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
40f0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
4100: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
4110: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
4120: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
4130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4140: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4150: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
4160: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
4170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4180: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4190: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
41a0: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
41b0: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
41c0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
41d0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
41e0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
41f0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
4200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4230: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
4240: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
4250: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
4260: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
4270: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
4280: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
4290: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
42a0: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
42b0: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
42c0: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
42d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
42e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
42f0: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
4300: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
4310: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
4320: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
4330: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
4340: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
4350: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
4360: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4370: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4380: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4390: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
43a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
43b0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
43c0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
43d0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
43e0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
43f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4400: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
4410: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
4420: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
4430: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
4440: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
4450: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4460: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
4470: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
4480: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
4490: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
44a0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
44b0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
44c0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
44d0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
44e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
44f0: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
4500: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
4510: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
4520: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
4530: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
4540: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4550: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
4560: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4570: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
4580: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
4590: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
45a0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
45b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
45c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
45d0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
45e0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
45f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
4600: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4610: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
4620: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4630: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
4640: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
4650: 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73  ke open().  Do s
4660: 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  o multiple times
4670: 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65  , until it eithe
4680: 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a  r succeeds or.**
4690: 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20   fails for some 
46a0: 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61  reason other tha
46b0: 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49  n EINTR..**.** I
46c0: 66 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74  f the file creat
46d0: 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20  ion mode "m" is 
46e0: 30 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  0 then set it to
46f0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
4700: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65  .** SQLite.  The
4710: 20 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49   default is SQLI
4720: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
4730: 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72  PERMISSIONS (nor
4740: 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61  mally.** 0644) a
4750: 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  s modified by th
4760: 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20  e system umask. 
4770: 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20   If m is not 0, 
4780: 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65  then.** make the
4790: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
47a0: 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d  ode be exactly m
47b0: 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d   ignoring the um
47c0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ask..**.** The m
47d0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20   parameter will 
47e0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79  be non-zero only
47f0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d   when creating -
4800: 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  wal, -journal,.*
4810: 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73  * and -shm files
4820: 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65  .  We want those
4830: 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a   files to have *
4840: 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d  exactly* the sam
4850: 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73  e.** permissions
4860: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
4870: 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61  al database, una
4880: 64 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68  dulterated by th
4890: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74  e umask..** In t
48a0: 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61  hat way, if a da
48b0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d  tabase file is -
48c0: 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d  rw-rw-rw or -rw-
48d0: 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20  rw-r-, and a.** 
48e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73  transaction cras
48f0: 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62  hes and leaves b
4900: 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61  ehind hot journa
4910: 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  ls, then any.** 
4920: 70 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20  process that is 
4930: 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  able to write to
4940: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
4950: 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20  ll also be able 
4960: 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68  to.** recover th
4970: 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  e hot journals..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
4990: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
49a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
49b0: 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74  mode_t m){.  int
49c0: 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32   fd;.  mode_t m2
49d0: 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54   = m ? m : SQLIT
49e0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
49f0: 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 64 6f  ERMISSIONS;.  do
4a00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4a10: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4a20: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4a30: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4a40: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4a50: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4a60: 66 0a 20 20 7d 77 68 69 6c 65 28 20 66 64 3c 30  f.  }while( fd<0
4a70: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4a80: 20 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20   );.  if( fd>=0 
4a90: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
4aa0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
4ab0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
4ac0: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
4ad0: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
4ae0: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
4af0: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
4b00: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
4b10: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
4b20: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
4b30: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
4b40: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
4b50: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
4b60: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
4b70: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
4b80: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
4b90: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
4ba0: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
4bb0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
4bc0: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
4bd0: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
4be0: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
4bf0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
4c00: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
4c10: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
4c20: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
4c30: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
4c40: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
4c50: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
4c60: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
4c70: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
4c80: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
4c90: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
4ca0: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
4cb0: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
4cc0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
4cd0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
4ce0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
4cf0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
4d00: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
4d10: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
4d20: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
4d30: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
4d40: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
4d50: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
4d60: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
4d70: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
4d80: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
4d90: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
4da0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
4db0: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
4dc0: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
4dd0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
4de0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
4df0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4e00: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
4e10: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4e20: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4e30: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4e40: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4e50: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
4e60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
4e70: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4e80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4e90: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4ea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4eb0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
4ec0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
4ed0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
4ee0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4ef0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4f00: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4f10: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4f20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
4f30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
4f40: 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
4f50: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4f60: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4f70: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
4f80: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
4f90: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
4fa0: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
4fb0: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
4fc0: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
4fd0: 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  etation of the s
4fe0: 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67  upplied.** integ
4ff0: 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f  er lock-type..*/
5000: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5010: 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69  ar *azFileLock(i
5020: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
5030: 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f   switch( eFileLo
5040: 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e  ck ){.    case N
5050: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
5060: 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20  NONE";.    case 
5070: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
5080: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
5090: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
50a0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
50b0: 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73  SERVED";.    cas
50c0: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20  e PENDING_LOCK: 
50d0: 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22  return "PENDING"
50e0: 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55  ;.    case EXCLU
50f0: 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  SIVE_LOCK: retur
5100: 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20  n "EXCLUSIVE";. 
5110: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52   }.  return "ERR
5120: 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  OR";.}.#endif..#
5130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ifdef SQLITE_LOC
5140: 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72  K_TRACE./*.** Pr
5150: 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74  int out informat
5160: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f  ion about all lo
5170: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
5180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5190: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
51a0: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
51b0: 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74   locks on multit
51c0: 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66  hreaded.** platf
51d0: 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79  orms.  Enable by
51e0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
51f0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43  the -DSQLITE_LOC
5200: 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61  K_TRACE.** comma
5210: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f  nd-line option o
5220: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
5230: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   This code is no
5240: 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64  rmally.** turned
5250: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
5260: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
5270: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
5280: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
5290: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
52a0: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
52b0: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
52c0: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
52d0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
52e0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
52f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5300: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
5310: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
5320: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5330: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5340: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
5350: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5360: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
5370: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
5380: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
5390: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
53a0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
53b0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
53c0: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
53d0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
53e0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
53f0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
5400: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
5410: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
5420: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
5430: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
5440: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5450: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
5460: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
5470: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73  _SET );.  s = os
5480: 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  Fcntl(fd, op, p)
5490: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
54a0: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
54b0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
54c0: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
54d0: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
54e0: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
54f0: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
5500: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
5510: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
5520: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
5530: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
5540: 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d   s==(-1) && op==
5550: 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c  F_SETLK && (p->l
5560: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c  _type==F_RDLCK |
5570: 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  | p->l_type==F_W
5580: 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72  RLCK) ){.    str
5590: 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20  uct flock l2;.  
55a0: 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f    l2 = *p;.    o
55b0: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
55c0: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
55d0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
55e0: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
55f0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
5600: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5610: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
5620: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5630: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
5640: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
5650: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
5660: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
5670: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
5680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
5690: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
56a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56b0: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
56c0: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
56d0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
56e0: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
56f0: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
5700: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
5710: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
5720: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
5730: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e   return s;.}.#un
5740: 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66  def osFcntl.#def
5750: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b  ine osFcntl lock
5760: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
5770: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
5780: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  E */../*.** Retr
5790: 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61  y ftruncate() ca
57a0: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
57b0: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74  e to EINTR.*/.st
57c0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
57d0: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
57e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
57f0: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  z){.  int rc;.  
5800: 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e  do{ rc = osFtrun
5810: 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69  cate(h,sz); }whi
5820: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
5830: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
5840: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5850: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
5860: 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e  ranslates a stan
5870: 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f  dard POSIX errno
5880: 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74   code into somet
5890: 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74  hing.** useful t
58a0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66  o the clients of
58b0: 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e   the sqlite3 fun
58c0: 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69  ctions.  Specifi
58d0: 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20  cally, it is.** 
58e0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e  intended to tran
58f0: 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20  slate a variety 
5900: 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65  of "try again" e
5910: 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54  rrors into SQLIT
5920: 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20  E_BUSY.** and a 
5930: 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61  variety of "plea
5940: 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  se close the fil
5950: 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57  e descriptor NOW
5960: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a  " errors into .*
5970: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a  * SQLITE_IOERR.*
5980: 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72  * .** Errors dur
5990: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
59a0: 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20  on of locks, or 
59b0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
59c0: 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a  ort for locks,.*
59d0: 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20  * should handle 
59e0: 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c  ENOLCK, ENOTSUP,
59f0: 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61   EOPNOTSUPP sepa
5a00: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
5a10: 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f  c int sqliteErro
5a20: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
5a30: 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20  int posixError, 
5a40: 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29  int sqliteIOErr)
5a50: 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73   {.  switch (pos
5a60: 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30  ixError) {.#if 0
5a70: 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
5a80: 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73  nt this code was
5a90: 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f   not commented o
5aa0: 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74  ut. In theory, t
5ab0: 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
5ac0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
5ad0: 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e  hit, as this fun
5ae0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c  ction should onl
5af0: 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
5b00: 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67  r.  ** a locking
5b10: 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f  -related functio
5b20: 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29  n (i.e. fcntl())
5b30: 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f   has returned no
5b40: 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a  n-zero with.  **
5b50: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72   the value of er
5b60: 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74  rno as the first
5b70: 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65   argument. Since
5b80: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68   a system call h
5b90: 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20  as failed,.  ** 
5ba0: 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20  errno should be 
5bb0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20  non-zero..  **. 
5bc0: 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73   ** Despite this
5bd0: 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c  , if errno reall
5be0: 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74  y is zero, we st
5bf0: 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74  ill don't want t
5c00: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
5c10: 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73  LITE_OK. The sys
5c20: 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c  tem call failed,
5c30: 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69   and *some* SQLi
5c40: 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20  te error should 
5c50: 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  be.  ** propagat
5c60: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63  ed back to the c
5c70: 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e  aller. Commentin
5c80: 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75  g this branch ou
5c90: 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30  t means errno==0
5ca0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61  .  ** will be ha
5cb0: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65  ndled by the "de
5cc0: 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c  fault:" case bel
5cd0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ow..  */.  case 
5ce0: 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0: .    return S
5cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
5d00: 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a  ..  case EAGAIN:
5d10: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
5d20: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
5d30: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
5d40: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
5d50: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
5d60: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
5d70: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
5d80: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5d90: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
5da0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
5db0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
5dc0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
5dd0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
5de0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
5df0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
5e00: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
5e10: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
5e20: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
5e30: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
5e40: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
5e50: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
5e60: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5e70: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
5e80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
5e90: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
5ea0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20  OERR_UNLOCK) || 
5eb0: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
5ec0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5ed0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
5ee0: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
5ef0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5f00: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
5f10: 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VEDLOCK) ){.    
5f20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f30: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
5f40: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72  /* else fall thr
5f50: 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45  ough */.  case E
5f60: 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72  PERM: .    retur
5f70: 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
5f80: 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b     .  /* EDEADLK
5f90: 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
5fa0: 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66  e if a call to f
5fb0: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69  cntl(F_SETLKW) i
5fc0: 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a  s made. And.  **
5fd0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76   this module nev
5fe0: 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20  er makes such a 
5ff0: 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f  call. And the co
6000: 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73  de in SQLite its
6010: 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74  elf .  ** assert
6020: 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f  s that SQLITE_IO
6030: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e  ERR_BLOCKED is n
6040: 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46  ever returned. F
6050: 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73  or these reasons
6060: 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20  .  ** this case 
6070: 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
6080: 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79  d out. If the sy
6090: 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72  stem does set er
60a0: 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a  rno to EDEADLK,.
60b0: 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74    ** the default
60c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
60d0: 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72  X code will be r
60e0: 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20  eturned. */.#if 
60f0: 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b  0.  case EDEADLK
6100: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
6110: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
6120: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23  D;.#endif.    .#
6130: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
6140: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
6150: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
6160: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
6170: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
6180: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
6190: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
61a0: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
61b0: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
61c0: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
61d0: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
61e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
61f0: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
6200: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
6210: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
6220: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6230: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6240: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6250: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
6260: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6270: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6280: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
6290: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
62a0: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
62b0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
62c0: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
62d0: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
62e0: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23    case ENOENT:.#
62f0: 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20 20  ifdef ESTALE    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f   /* ESTALE is no
6320: 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74  t defined on Int
6330: 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a  erix systems */.
6340: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23    case ESTALE:.#
6350: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f  endif.  case ENO
6360: 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73  SYS:.    /* thes
6370: 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74  e should force t
6380: 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f  he client to clo
6390: 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
63a0: 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  reconnect */.   
63b0: 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20   .  default: .  
63c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49    return sqliteI
63d0: 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f  OErr;.  }.}..../
63e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6440: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
6450: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6460: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6480: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
6490: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
64a0: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
64b0: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
64c0: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
64d0: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
64e0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
64f0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
6500: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
6510: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
6520: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
6530: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
6540: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
6550: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
6560: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
6570: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
6580: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6590: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
65a0: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
65b0: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
65c0: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
65d0: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
65e0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
65f0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
6600: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
6610: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6620: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
6630: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6640: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
6650: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
6660: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
6670: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6680: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
6690: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
66a0: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
66b0: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
66c0: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
66d0: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
66e0: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
66f0: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
6700: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
6710: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
6720: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
6730: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
6740: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
6750: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
6760: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6770: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
6780: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
6790: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
67a0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
67c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
67d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
67e0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
67f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6800: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6810: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
6820: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
6830: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
6840: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
6850: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
6860: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
6870: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
6880: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
6890: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
68a0: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
68b0: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
68c0: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
68d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
68e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
68f0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6900: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6910: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6920: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6930: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
6940: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
6950: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
6960: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
6970: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
6980: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
6990: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
69a0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
69b0: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
69c0: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
69d0: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
69e0: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
69f0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6a00: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6a10: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6a20: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6a30: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
6a40: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
6a50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6a60: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
6a70: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
6a80: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
6a90: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6aa0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6ab0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6ac0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6ad0: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6ae0: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6af0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6b00: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6b10: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6b20: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6b30: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
6b40: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6b50: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
6b60: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
6b70: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
6b80: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6b90: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6ba0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
6bb0: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
6bc0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
6bd0: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
6be0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
6bf0: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
6c00: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6c10: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
6c20: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
6c30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6c40: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
6c50: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
6c60: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
6c70: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
6c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
6c90: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
6ca0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
6cb0: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
6cc0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
6cd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
6ce0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6cf0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
6d00: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
6d10: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
6d20: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
6d30: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
6d40: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
6d50: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
6d60: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
6d70: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
6d80: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
6d90: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
6da0: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
6db0: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
6dc0: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
6dd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
6de0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6df0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
6e00: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
6e10: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
6e20: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
6e30: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
6e40: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
6e50: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
6e60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6e70: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
6e80: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
6e90: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
6ea0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6eb0: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
6ec0: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
6ed0: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
6ee0: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
6ef0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6f20: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
6f30: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
6f40: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
6f50: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
6f60: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
6f70: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
6f80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
6f90: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
6fa0: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
6fb0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
6fc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
6fd0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6fe0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
6ff0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
7000: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7010: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
7020: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7030: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7040: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7050: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7060: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7070: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7080: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7090: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
70a0: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
70b0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
70c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
70d0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
70e0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
70f0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
7100: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
7110: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
7120: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7130: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7140: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7150: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7160: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7170: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7180: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7190: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
71a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
71b0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
71c0: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
71d0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
71e0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
71f0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
7200: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
7210: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7220: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7230: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7240: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7250: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7260: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7270: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7280: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7290: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
72a0: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
72b0: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
72c0: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
72d0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
72e0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
72f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
7310: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7320: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7330: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7340: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7350: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7360: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7370: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7390: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
73a0: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
73b0: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
73c0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
73d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
73e0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
73f0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
7400: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
7410: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
7420: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7430: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7440: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7450: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7460: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7470: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7480: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7490: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
74a0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
74b0: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
74c0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
74d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
74e0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
7500: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
7510: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
7520: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
75e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7600: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7610: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7630: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7640: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7650: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7660: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7670: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7680: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7690: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
76a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
76b0: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
76c0: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
76d0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
76e0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
76f0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7700: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7710: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7720: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7730: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7740: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7750: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7760: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7770: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7780: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7790: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
77a0: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
77b0: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
77c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
77d0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
77e0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
77f0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7800: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7810: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7820: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7830: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7840: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7850: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7860: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7870: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7880: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7890: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
78a0: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
78b0: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
78c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
78d0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
78e0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
78f0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7900: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7910: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7920: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7930: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7940: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7950: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7960: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7970: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7980: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7990: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
79a0: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
79b0: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
79c0: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
79d0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
79e0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
79f0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7a00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7a10: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7a20: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7a30: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7a40: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7a50: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7a60: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7a70: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7a80: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7a90: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7aa0: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7ab0: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7ac0: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7ad0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7ae0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7af0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7b00: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7b10: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7b20: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7b30: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7b40: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7b50: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7b60: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7b70: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7b80: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7b90: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7ba0: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7bb0: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7bc0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7bd0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7be0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7bf0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7c00: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7c10: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7c20: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7c30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7c40: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7c50: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7c60: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7c70: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7c80: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7c90: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7ca0: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7cb0: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7cc0: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7cd0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7ce0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7cf0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7d00: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7d10: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7d20: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7d30: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
7d40: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
7d50: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
7d60: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
7d70: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
7d80: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
7d90: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
7da0: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
7db0: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
7dc0: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
7dd0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
7de0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
7df0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
7e00: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
7e10: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
7e20: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
7e30: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
7e40: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
7e50: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7e60: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
7e70: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
7e80: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7e90: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7ea0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
7eb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
7ec0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
7ed0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
7ee0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
7ef0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7f00: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
7f10: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
7f20: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
7f30: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
7f40: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
7f50: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
7f60: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
7f70: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
7f80: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
7f90: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
7fa0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
7fb0: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
7fc0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7fd0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
7fe0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
7ff0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
8000: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
8010: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
8020: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8030: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8040: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8050: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8060: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8070: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8080: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8090: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
80a0: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
80b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
80c0: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
80d0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
80e0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
80f0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
8100: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
8110: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
8120: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8130: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8140: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8150: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8160: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8170: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8180: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8190: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
81a0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
81b0: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
81c0: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
81d0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
81e0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
81f0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
8200: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
8210: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
8220: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8230: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8240: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8250: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8260: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8270: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8280: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8290: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
82a0: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
82b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
82c0: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
82d0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
82e0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
82f0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
8300: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
8310: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
8320: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8330: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8340: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8350: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8360: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8370: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8380: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8390: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
83a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
83b0: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
83c0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
83d0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
83e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
83f0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
8400: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
8410: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
8420: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8430: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8440: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8450: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8460: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8470: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8480: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8490: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
84a0: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
84b0: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
84c0: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
84d0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
84e0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
84f0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
8500: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
8510: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
8520: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8530: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8540: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8550: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8560: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8570: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8580: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8590: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
85a0: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
85b0: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
85c0: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
85d0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
85e0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
85f0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8600: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8610: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8620: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8630: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8640: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8650: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8660: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8670: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8680: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8690: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
86a0: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
86b0: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
86c0: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
86d0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
86e0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
86f0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8700: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8710: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8720: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8730: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8740: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8750: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8760: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8770: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8780: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8790: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
87a0: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
87b0: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
87c0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
87d0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
87e0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
87f0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8800: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8810: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8820: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8830: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8840: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8850: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8860: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8870: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8880: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8890: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
88a0: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
88b0: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
88c0: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
88d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
88e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
88f0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8900: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8910: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8920: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8930: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8940: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8950: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8980: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8990: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
89a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
89b0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
89c0: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
89d0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
89e0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
89f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8a00: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8a10: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8a20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8a30: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8a40: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8a50: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8a60: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8a70: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8a80: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8a90: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8aa0: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8ab0: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8ac0: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8ad0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8ae0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8af0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8b00: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8b10: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8b20: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8b30: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8b40: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8b50: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8b60: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8b70: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8b80: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8b90: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8ba0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8bb0: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8bc0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8bd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8be0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8bf0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8c20: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8c40: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8c50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8c60: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8c70: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8c80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8c90: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8ca0: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8cb0: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8cc0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8cd0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8cf0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8d00: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8d10: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8d20: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
8d40: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
8d50: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8d60: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
8d70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
8d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8d90: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
8da0: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
8db0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8dc0: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
8dd0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
8de0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
8df0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
8e00: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
8e10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8e20: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
8e30: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8e40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
8e50: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
8e60: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
8e70: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
8e80: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
8e90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8ea0: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
8eb0: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
8ec0: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
8ed0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
8ee0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
8ef0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8f00: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
8f30: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
8f40: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
8f50: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
8f60: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
8f70: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
8f80: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
8f90: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
8fa0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
8fc0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
8fd0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
8fe0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8ff0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
9000: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
9010: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
9020: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9030: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9040: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9050: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9060: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9070: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9080: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9090: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
90a0: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
90b0: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
90c0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
90d0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
90e0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
90f0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
9100: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
9110: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9120: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9130: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9140: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9150: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9160: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9170: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9180: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9190: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
91a0: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
91b0: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
91c0: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
91d0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
91e0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
91f0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
9200: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
9210: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
9220: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9230: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9240: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9250: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9260: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9270: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9280: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9290: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
92a0: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
92b0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
92c0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
92d0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
9300: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
9310: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
9320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9330: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9340: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9360: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9370: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9380: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9390: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
93a0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
93b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
93c0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
93d0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
93e0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
93f0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9410: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
9420: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
9430: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9440: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9460: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9470: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9480: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9490: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
94a0: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
94b0: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
94c0: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
94d0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
94e0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
94f0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
9500: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
9510: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
9520: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
9530: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
9540: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
9550: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9560: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
9570: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
9580: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
9590: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
95a0: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
95b0: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
95c0: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
95d0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
95e0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
95f0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
9600: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
9610: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9620: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9630: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9640: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
9650: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
9660: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9670: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
9680: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
9690: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
96a0: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
96b0: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
96c0: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
96d0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
96e0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
96f0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
9700: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
9710: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
9720: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9730: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
9740: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
9750: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
9760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9770: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
9780: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
9790: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
97a0: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
97b0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
97c0: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
97d0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
97e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
97f0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
9800: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
9810: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
9820: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
9830: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
9840: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9850: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
9860: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
9870: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
9880: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
9890: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
98a0: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
98b0: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
98c0: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
98d0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
98e0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
98f0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
9900: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
9910: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
9920: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
9930: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
9940: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
9950: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
9960: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
9970: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
9980: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
9990: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
99a0: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
99b0: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
99c0: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
99d0: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
99e0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
99f0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9a00: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
9a10: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
9a20: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
9a30: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
9a40: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
9a50: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
9a60: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
9a70: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
9a80: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9a90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
9aa0: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
9ab0: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
9ac0: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
9ad0: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
9ae0: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
9af0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
9b00: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
9b10: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
9b20: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
9b30: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
9b40: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
9b50: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
9b60: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
9b70: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
9b80: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
9b90: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
9ba0: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
9bb0: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
9bc0: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
9bd0: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
9be0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
9bf0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
9c00: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
9c10: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
9c20: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
9c30: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
9c40: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
9c50: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
9c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
9c70: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
9c80: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
9c90: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
9ca0: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
9cb0: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
9cc0: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
9cd0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
9ce0: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
9d00: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
9d10: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
9d20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
9d30: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
9d40: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
9d50: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
9d60: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
9d70: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
9d80: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
9d90: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
9da0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9db0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9dc0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9dd0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
9de0: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
9df0: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
9e00: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
9e10: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
9e20: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
9e30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
9e40: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
9e50: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
9e60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
9e70: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
9e80: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9e90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
9ea0: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
9eb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
9ec0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
9ed0: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
9ee0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
9ef0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
9f00: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
9f10: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
9f20: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
9f30: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
9f40: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
9f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f60: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
9f70: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f80: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f90: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9fa0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
9fb0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
9fc0: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
9fd0: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
9fe0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
9ff0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
a000: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
a010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a020: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
a030: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
a040: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
a050: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
a060: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
a070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a080: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
a090: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
a0a0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
a0b0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
a0c0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0e0: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
a0f0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
a100: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
a110: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
a120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a130: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
a140: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a150: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
a160: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
a170: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a180: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
a190: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
a1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a1b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
a1c0: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
a1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
a1e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a1f0: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
a200: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a210: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
a220: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
a230: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
a240: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
a250: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
a260: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
a270: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
a280: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
a290: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
a2a0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a2b0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a2c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a2d0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a2e0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a2f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a300: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a310: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
a320: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
a330: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
a340: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
a350: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
a360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
a370: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
a380: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
a390: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
a3a0: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
a3b0: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
a3c0: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
a3d0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
a3e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
a3f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
a410: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
a420: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a450: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
a460: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
a470: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
a480: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
a490: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
a4a0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a4b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
a4c0: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
a4d0: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
a4e0: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
a4f0: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
a500: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a510: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
a520: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
a530: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
a540: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a550: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
a560: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
a570: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a580: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
a590: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
a5a0: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
a5b0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
a5c0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
a5d0: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
a5e0: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
a5f0: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
a600: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
a610: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
a620: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
a630: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
a640: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
a650: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
a660: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
a670: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
a680: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a690: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
a6a0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
a6b0: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
a6c0: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
a6d0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
a6e0: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
a6f0: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
a700: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
a710: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
a720: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
a730: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
a740: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
a750: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
a760: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
a770: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
a780: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
a790: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
a7a0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
a7b0: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
a7c0: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
a7d0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
a7e0: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
a7f0: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
a800: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
a810: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
a820: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
a830: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
a840: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
a850: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
a860: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
a870: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
a880: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
a890: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
a8a0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
a8b0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
a8c0: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
a8d0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
a8e0: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
a8f0: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
a900: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
a910: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
a920: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
a930: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
a940: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
a950: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
a960: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
a970: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
a980: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
a990: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
a9a0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
a9b0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a9c0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
a9d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
a9e0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
a9f0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
aa00: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
aa10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
aa20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
aa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
aa40: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
aa50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa60: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
aa70: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
aa80: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
aa90: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
aaa0: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
aab0: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
aac0: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
aad0: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
aae0: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
aaf0: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
ab00: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
ab10: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
ab20: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
ab30: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
ab40: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
ab50: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
ab60: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
ab70: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
ab80: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
ab90: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
aba0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
abb0: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
abc0: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
abd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
abe0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
abf0: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
ac00: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
ac10: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
ac20: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
ac30: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
ac40: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ac50: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
ac60: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
ac70: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
ac80: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
ac90: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
aca0: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
acb0: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
acc0: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
acd0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
ace0: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
acf0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
ad00: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
ad10: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
ad20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ad30: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
ad40: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
ad50: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
ad60: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
ad70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
ad80: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
ad90: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ada0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
adb0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
adc0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
add0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
ade0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
adf0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
ae00: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
ae10: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
ae20: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
ae30: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
ae40: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
ae50: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
ae60: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
ae70: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
ae80: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
ae90: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
aea0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
aeb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
aec0: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
aed0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
aee0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
aef0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
af00: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
af10: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
af20: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
af30: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
af40: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
af50: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
af60: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
af70: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
af80: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
af90: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
afa0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
afb0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
afc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
afd0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
afe0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
aff0: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
b000: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
b010: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
b020: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
b030: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
b040: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
b050: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
b060: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
b070: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
b080: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
b090: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
b0a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
b0b0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b0c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b0d0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
b0e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
b0f0: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
b100: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
b110: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
b120: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
b130: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
b140: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
b150: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
b160: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  EDLOCK;.      pF
b170: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b180: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c   errno;.    } el
b190: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
b1a0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
b1b0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
b1c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
b1d0: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
b1e0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
b1f0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
b200: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
b210: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
b220: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
b230: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
b240: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
b250: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b260: 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  Attempt to set a
b270: 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20   system-lock on 
b280: 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20  the file pFile. 
b290: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   The lock is .**
b2a0: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c   described by pL
b2b0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
b2c0: 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e  e pFile was open
b2d0: 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72  ed read/write fr
b2e0: 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68  om unix-excl, th
b2f0: 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b  en the only lock
b300: 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65  .** ever obtaine
b310: 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76  d is an exclusiv
b320: 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69  e lock, and it i
b330: 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74  s obtained exact
b340: 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66  ly once.** the f
b350: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
b360: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
b370: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
b380: 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a   system locking.
b390: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65  ** operations be
b3a0: 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f  come no-ops.  Lo
b3b0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
b3c0: 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e   still happen in
b3d0: 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20  ternally,.** in 
b3e0: 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e  order to coordin
b3f0: 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65  ate access betwe
b400: 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61  en separate data
b410: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
b420: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
b430: 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c  process, but all
b440: 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64   of that is hand
b450: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
b460: 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  d the.** operati
b470: 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  ng system does n
b480: 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a  ot participate..
b490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b4a0: 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68  ion is a pass-th
b4b0: 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46  rough to fcntl(F
b4c0: 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65  _SETLK) if pFile
b4d0: 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79   is using.** any
b4e0: 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20   VFS other than 
b4f0: 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69  "unix-excl" or i
b500: 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65  f pFile is opene
b510: 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  d on "unix-excl"
b520: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
b530: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  only..**.** Zero
b540: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
b550: 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74  the call complet
b560: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  es successfully,
b570: 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c   or -1 if a call
b580: 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66  .** to fcntl() f
b590: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
b5a0: 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74  se, errno is set
b5b0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28   appropriately (
b5c0: 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a  by fcntl())..*/.
b5d0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
b5e0: 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  ileLock(unixFile
b5f0: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
b600: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  flock *pLock){. 
b610: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49   int rc;.  unixI
b620: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
b630: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
b640: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
b650: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
b660: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21   assert( pInode!
b670: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46  =0 );.  if( ((pF
b680: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b690: 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21   UNIXFILE_EXCL)!
b6a0: 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50  =0 || pInode->bP
b6b0: 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26  rocessLock).   &
b6c0: 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  & ((pFile->ctrlF
b6d0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b6e0: 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b  RDONLY)==0).  ){
b6f0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
b700: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
b710: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
b720: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
b730: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
b740: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
b750: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b760: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b770: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b780: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
b790: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
b7a0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b7b0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
b7c0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
b7d0: 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74       rc = osFcnt
b7e0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b7f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
b800: 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65     if( rc<0 ) re
b810: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
b820: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b830: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ock = 1;.      p
b840: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
b850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b860: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
b870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
b880: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b890: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63  h, F_SETLK, pLoc
b8a0: 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
b8b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
b8c0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
b8d0: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
b8e0: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
b8f0: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
b900: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
b910: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
b920: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
b930: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
b940: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
b950: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
b960: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
b970: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
b980: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
b990: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
b9a0: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
b9b0: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
b9c0: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
b9d0: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
b9e0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
b9f0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
ba00: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
ba10: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
ba20: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
ba30: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
ba40: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
ba50: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
ba60: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
ba70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
ba80: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
ba90: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
baa0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
bab0: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
bac0: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
bad0: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
bae0: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
baf0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
bb00: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
bb10: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
bb20: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
bb30: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
bb40: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
bb50: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
bb60: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
bb70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
bb80: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
bb90: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
bba0: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
bbb0: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
bbc0: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
bbd0: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
bbe0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
bbf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
bc00: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
bc10: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
bc20: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
bc30: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
bc40: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
bc50: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
bc60: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
bc70: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
bc80: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
bc90: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
bca0: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
bcb0: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
bcc0: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
bcd0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
bce0: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
bcf0: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
bd00: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
bd10: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
bd20: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
bd30: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
bd40: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
bd50: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
bd60: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
bd70: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
bd80: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
bd90: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
bda0: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
bdb0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
bdc0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
bdd0: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
bde0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
bdf0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
be00: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
be10: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
be20: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
be30: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
be40: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
be50: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
be60: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
be70: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
be80: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
be90: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
bea0: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
beb0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
bec0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
bed0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
bee0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
bef0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
bf00: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
bf10: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
bf20: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
bf30: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
bf40: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
bf50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
bf60: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
bf70: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
bf80: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
bf90: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
bfa0: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
bfb0: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
bfc0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
bfd0: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
bfe0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
bff0: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
c000: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
c010: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
c020: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
c030: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
c040: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
c050: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
c060: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
c070: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
c080: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
c090: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
c0a0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
c0b0: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
c0c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
c0d0: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
c0e0: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
c0f0: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
c100: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
c110: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
c120: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
c130: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
c140: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
c150: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
c160: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
c170: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
c180: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
c190: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
c1a0: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
c1b0: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
c1c0: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
c1d0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
c1e0: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
c1f0: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
c200: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c210: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
c220: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
c230: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
c240: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c250: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
c260: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
c270: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
c280: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
c290: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
c2a0: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
c2b0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
c2c0: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
c2d0: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
c2e0: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
c2f0: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
c300: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
c310: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
c320: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
c330: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
c340: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
c350: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
c360: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
c370: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
c380: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
c390: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
c3a0: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
c3b0: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
c3c0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
c3d0: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
c3e0: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
c3f0: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
c400: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
c410: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
c420: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
c430: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
c440: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
c450: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c460: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
c470: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
c480: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
c490: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
c4a0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
c4b0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
c4c0: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
c4d0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
c4e0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
c4f0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
c500: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
c510: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
c520: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
c530: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
c540: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
c550: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
c560: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
c570: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
c580: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
c590: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
c5a0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
c5b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
c5c0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
c5d0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
c5e0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
c5f0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
c600: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
c610: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
c620: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
c630: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
c640: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
c650: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
c660: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
c670: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
c680: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
c690: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
c6a0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
c6b0: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
c6c0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
c6e0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
c6f0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
c700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c710: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
c720: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
c730: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
c740: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
c750: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
c760: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
c770: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
c780: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
c790: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
c7a0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
c7b0: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
c7c0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
c7d0: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
c7e0: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
c7f0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
c800: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
c810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
c820: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
c830: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
c840: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c850: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c860: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
c870: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
c880: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
c890: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c8a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c8b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c8c0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
c8d0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
c8e0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
c8f0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
c900: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
c910: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
c920: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
c930: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
c940: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
c950: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
c960: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
c970: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
c980: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
c990: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
c9a0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
c9b0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
c9c0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
c9d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
c9e0: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
c9f0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
ca00: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
ca10: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ca20: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
ca30: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
ca40: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ca50: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ca60: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ca70: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
ca80: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
ca90: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
caa0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
cab0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
cac0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
cad0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
cae0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
caf0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
cb00: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
cb10: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
cb20: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
cb30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
cb40: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
cb50: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
cb60: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
cb70: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
cb80: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
cb90: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
cba0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cbb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cbc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
cbd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
cbe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
cbf0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
cc00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
cc10: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
cc20: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
cc30: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
cc40: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
cc50: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
cc60: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
cc70: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
cc80: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
cc90: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
cca0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ccb0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ccc0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ccd0: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
cce0: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
ccf0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
cd00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
cd10: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
cd20: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
cd30: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
cd40: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cd50: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
cd60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
cd70: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
cd80: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
cd90: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
cda0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cdb0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
cdc0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
cdd0: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
cde0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
cdf0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ce00: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ce10: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ce20: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ce30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ce40: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ce50: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ce60: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ce70: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
ce80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ce90: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
cea0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ceb0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
cec0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
ced0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
cee0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
cef0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
cf00: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
cf10: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
cf20: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
cf30: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
cf40: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
cf50: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
cf60: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
cf70: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
cf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
cf90: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
cfa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cfb0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cfc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
cfd0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
cfe0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
cff0: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
d000: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d010: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d020: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
d030: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
d040: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
d050: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d060: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
d070: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d080: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d090: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d0a0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d0b0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
d0c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d0d0: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
d0e0: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
d0f0: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
d100: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
d110: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
d120: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
d130: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
d140: 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  K;.    if( unixF
d150: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d160: 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  lock) && rc==SQL
d170: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d180: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
d190: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
d1a0: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
d1b0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d1c0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
d1d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
d1e0: 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K; .    }..    i
d1f0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
d200: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
d210: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
d220: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d230: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d240: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d250: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lock;.    }else{
d260: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
d270: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
d280: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
d290: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
d2a0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
d2b0: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
d2c0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
d2d0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d2e0: 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
d2f0: 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
d300: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
d310: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
d320: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
d330: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
d340: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
d350: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
d360: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
d370: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
d380: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
d3a0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
d3b0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
d3c0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
d3d0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
d3e0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
d3f0: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
d400: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
d410: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
d420: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
d430: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
d440: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
d450: 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
d460: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
d470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
d480: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
d490: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
d4a0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d4b0: 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46  CK );.    if( eF
d4c0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
d4d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
d4e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
d4f0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
d500: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d510: 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1L;.    }else{.
d520: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d530: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d540: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d550: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d560: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  E;.    }..    if
d570: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
d580: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
d590: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d5a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d5b0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d5c0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d5d0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d5e0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
d5f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
d600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d610: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d620: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
d630: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
d640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d650: 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
d660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
d670: 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
d680: 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
d690: 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
d6a0: 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
d6b0: 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
d6c0: 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
d6d0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
d6e0: 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
d6f0: 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
d700: 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
d710: 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
d720: 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
d730: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
d740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
d750: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
d760: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d770: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20  <=SHARED_LOCK.  
d780: 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52   && eFileLock==R
d790: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29  ESERVED_LOCK.  )
d7a0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61  {.    pFile->tra
d7b0: 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a  nsCntrChng = 0;.
d7c0: 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
d7d0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ate = 0;.    pFi
d7e0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d7f0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 1;.  }.#endi
d800: 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f...  if( rc==SQ
d810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
d820: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d830: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
d840: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d850: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
d860: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
d870: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
d880: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d890: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d8a0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
d8b0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
d8c0: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
d8d0: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
d8e0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
d8f0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
d900: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d910: 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %s (unix)\n", p
d920: 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
d930: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
d940: 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
d950: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
d960: 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
d970: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d980: 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73  Add the file des
d990: 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20  criptor used by 
d9a0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c  file handle pFil
d9b0: 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70  e to the corresp
d9c0: 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65  onding.** pUnuse
d9d0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  d list..*/.stati
d9e0: 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e  c void setPendin
d9f0: 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  gFd(unixFile *pF
da00: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
da10: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
da20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
da30: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
da40: 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65   = pFile->pUnuse
da50: 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  d;.  p->pNext = 
da60: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
da70: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
da80: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
da90: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
daa0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
dac0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
dad0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
dae0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
daf0: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
db00: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
db10: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
db20: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
db30: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
db40: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
db50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
db60: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
db70: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
db80: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
db90: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
dba0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
dbb0: 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
dbc0: 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
dbd0: 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
dbe0: 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
dbf0: 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
dc00: 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
dc10: 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
dc20: 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
dc30: 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
dc40: 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
dc50: 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
dc60: 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
dc70: 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
dc80: 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
dc90: 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
dca0: 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
dcb0: 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
dcc0: 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
dcd0: 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
dce0: 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
dcf0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
dd00: 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
dd10: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
dd20: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
dd30: 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
dd40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
dd50: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
dd60: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
dd70: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
dd80: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
dd90: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
dda0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ddb0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
ddc0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
ddd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
dde0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ddf0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
de00: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
de10: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
de20: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
de30: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
de40: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
de50: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
de60: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
de70: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
de80: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
de90: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
dea0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
deb0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
dec0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
ded0: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
dee0: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
def0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
df00: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
df10: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
df20: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
df30: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
df40: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
df50: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
df60: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
df70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
df80: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
df90: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
dfa0: 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ock );..#ifdef S
dfb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
dfc0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
dfd0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
dfe0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
dff0: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
e000: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
e010: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
e020: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
e030: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
e040: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
e050: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
e060: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
e070: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
e080: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
e090: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
e0a0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
e0b0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
e0c0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
e0d0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
e0e0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
e0f0: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
e100: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
e110: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
e120: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
e130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
e140: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
e150: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
e160: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
e170: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
e180: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
e190: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
e1a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
e1b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
e1c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
e1d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
e1e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
e1f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
e200: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
e210: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
e220: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
e230: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
e240: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
e250: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
e260: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
e270: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
e280: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
e290: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
e2a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
e2b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
e2c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
e2d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
e2e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
e2f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
e300: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
e310: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
e320: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
e330: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
e340: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e350: 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64  _LOCK ){..#if !d
e360: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
e370: 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
e380: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e390: 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
e3a0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
e3b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
e3c0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
e3d0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
e3e0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
e3f0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
e400: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
e410: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
e420: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
e430: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b       int tErrno;
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e450: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
e460: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72  m system call er
e470: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
e480: 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20  off_t divSize = 
e490: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b  SHARED_SIZE - 1;
e4a0: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
e4b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e4c0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
e4d0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e4e0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e4f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e500: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e510: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
e520: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
e530: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
e540: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e550: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
e560: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
e570: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
e580: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e590: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e5a0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e5b0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e5c0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e5d0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e5e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e5f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
e600: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
e620: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
e630: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
e640: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e650: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e660: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e670: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e680: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e690: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
e6a0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e6b0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e6c0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
e6d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e6e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e6f0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e700: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e710: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e720: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
e730: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e740: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e750: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e760: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e770: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e780: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
e790: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
e7b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e7c0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
e7d0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e7e0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e7f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e800: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
e810: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
e820: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
e830: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
e840: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
e850: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e860: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
e870: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
e880: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
e890: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e8a0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
e8b0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
e8c0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
e8e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
e8f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
e900: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
e910: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e930: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
e940: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
e950: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
e960: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
e970: 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
e980: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e990: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
e9a0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e9b0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e9c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e9d0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e9e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e9f0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
ea00: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
ea10: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ea20: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
ea30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
ea40: 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
ea50: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
ea60: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
ea70: 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
ea80: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
ea90: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
eaa0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
eab0: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
eac0: 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
ead0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
eae0: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
eaf0: 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
eb00: 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
eb10: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
eb20: 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
eb30: 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
eb40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
eb50: 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
eb60: 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
eb70: 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
eb80: 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
eb90: 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
eba0: 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
ebb0: 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
ebc0: 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ebe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ebf0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OCK;.          p
ec00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ec10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
ec20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ec30: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
ec40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ec50: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ec60: 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
ec70: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ec80: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
ec90: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
eca0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
ecb0: 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
ecc0: 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
ecd0: 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
ece0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  E );.    if( uni
ecf0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
ed00: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
ed10: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ed20: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
ed30: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
ed40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ed50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ed60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ed70: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ed80: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ed90: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
eda0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
edb0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
edc0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
edd0: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
ede0: 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
edf0: 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
ee00: 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
ee10: 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
ee20: 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
ee30: 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
ee40: 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
ee50: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
ee60: 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  /.    pInode->nS
ee70: 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
ee80: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ee90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
eea0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
eeb0: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
eec0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
eed0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
eee0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
eef0: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
ef00: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
ef10: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
ef20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
ef30: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
ef40: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ef50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
ef60: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ef70: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ef80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ef90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
efa0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
efb0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
efc0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
efd0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
efe0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
eff0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
f000: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
f010: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
f020: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
f030: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
f040: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
f050: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
f060: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
f070: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
f080: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
f090: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
f0a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
f0b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
f0c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
f0d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
f0e0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
f0f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
f100: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
f110: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
f120: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
f130: 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
f140: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f150: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
f160: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
f170: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
f180: 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
f190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
f1a0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
f1b0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
f1c0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
f1d0: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
f1e0: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
f1f0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
f200: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
f210: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
f220: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
f230: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f240: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
f250: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
f260: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
f270: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
f280: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f290: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
f2a0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
f2b0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f2c0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
f2d0: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
f2e0: 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
f2f0: 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k, 0);.}../*.** 
f300: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
f310: 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
f320: 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
f330: 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
f340: 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
f350: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
f360: 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
f370: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
f380: 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
f390: 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
f3a0: 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
f3b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
f3c0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
f3d0: 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
f3e0: 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
f3f0: 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
f400: 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
f410: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f420: 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
f430: 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
f440: 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
f450: 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
f460: 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
f470: 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
f480: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
f490: 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
f4a0: 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
f4b0: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
f4c0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f4d0: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
f4e0: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
f4f0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
f500: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
f510: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
f520: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
f530: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
f540: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
f550: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
f560: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
f570: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
f580: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
f590: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
f5a0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
f5b0: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
f5c0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
f5d0: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
f5e0: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
f5f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
f600: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
f610: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
f620: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
f630: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
f640: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
f650: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
f660: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
f670: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
f680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f690: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
f6a0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f6b0: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
f6c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f6d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f6e0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
f6f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f700: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
f710: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
f720: 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
f730: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
f740: 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
f750: 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
f760: 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
f770: 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
f780: 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
f790: 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
f7a0: 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
f7b0: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
f7c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
f7d0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
f7e0: 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
f7f0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
f800: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
f810: 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
f820: 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
f830: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
f840: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
f850: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
f860: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
f870: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
f880: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
f890: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
f8a0: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
f8b0: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
f8c0: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
f8d0: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
f8e0: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
f8f0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
f900: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
f910: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
f920: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
f930: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
f940: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
f950: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
f960: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
f970: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
f980: 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
f990: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f9a0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f9b0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
f9c0: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f9d0: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
f9e0: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
f9f0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
fa00: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
fa10: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa60: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
fa70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
faa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fab0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fad0: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
fae0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
faf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
fb10: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
fb20: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
fb30: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
fb40: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
fb50: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
fb60: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
fb70: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
fb80: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
fb90: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
fba0: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
fbb0: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
fbc0: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
fbd0: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
fbe0: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
fbf0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
fc00: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
fc10: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
fc20: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
fc30: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
fc40: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
fc50: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
fc60: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
fc70: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
fc80: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
fc90: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
fca0: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
fcb0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
fcc0: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
fcd0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
fce0: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
fcf0: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
fd00: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
fd10: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
fd20: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
fd30: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
fd40: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
fd50: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
fd60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
fd70: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
fd80: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
fd90: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
fda0: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
fdb0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
fdc0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
fdd0: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
fde0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
fdf0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
fe00: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
fe10: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
fe20: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
fe30: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
fe40: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
fe50: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
fe60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
fe70: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
fe80: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fe90: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
fea0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
feb0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
fec0: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
fed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fee0: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
fef0: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
ff00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
ff10: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
ff20: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
ff30: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
ff40: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
ff50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
ff70: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
ff80: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
ff90: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ffa0: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
ffb0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
ffc0: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
ffe0: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
fff0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
10070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
100c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100d0 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
100e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
100f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10100 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
10110 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10120 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10130 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
10140 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
10150 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
10160 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
10170 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
10180 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
10190 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
101a0 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
101b0 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
101c0 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
101d0 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
101e0 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
101f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
10200 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
10210 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
10220 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
10230 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
10240 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
10250 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
10260 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
10270 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
10280 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
10290 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
102a0 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
102b0 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
102c0 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
102d0 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
102e0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
102f0 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
10300 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
10310 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
10320 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
10330 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
10340 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
10350 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
10360 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
10370 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
10380 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
10390 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
103a0 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
103b0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
103c0 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
103d0 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
103e0 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
103f0 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
10400 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
10410 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
10420 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
10430 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
10440 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10450 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
10460 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
10470 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
10480 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
10490 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
104a0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
104b0 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
104c0 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
104d0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
104e0 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
104f0 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
10500 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
10510 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
10520 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
10530 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10540 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
10550 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
10560 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
10570 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10580 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
10590 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
105a0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
105b0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
105c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
105d0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
105e0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
105f0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
10600 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
10610 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
10620 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
10630 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10640 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
10650 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
10660 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
10670 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
10680 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
10690 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
106a0 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
106b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
106c0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
106d0 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
106e0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
106f0 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
10700 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
10710 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
10720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10730 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
10740 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10750 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10760 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
10770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10780 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
10790 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
107a0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
107b0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
107c0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
107d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
107e0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
107f0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
10800 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
10810 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
10820 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10830 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10840 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
10850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
10860 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
10870 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
10880 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
10890 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
108a0 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
108b0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
108c0 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
108d0 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
108e0 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
108f0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
10900 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
10910 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
10920 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
10930 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
10940 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
10950 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10960 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
10970 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
10980 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10990 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
109a0 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
109b0 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
109c0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
109d0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
109e0 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
109f0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
10a00 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
10a10 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
10a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10a30 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
10a40 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
10a50 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10a60 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
10a70 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10a80 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10a90 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10aa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10ab0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10ac0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10ad0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10ae0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
10af0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
10b00 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
10b10 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
10b20 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10b30 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
10b40 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10b50 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10b60 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10b70 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10b80 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10b90 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10ba0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10bb0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10bc0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10bd0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10be0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
10bf0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
10c00 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
10c10 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
10c20 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
10c30 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
10c40 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10c50 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10c60 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10c70 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10c80 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10c90 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10ca0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10cb0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10cc0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10cd0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10cf0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
10d00 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
10d10 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
10d20 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
10d30 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
10d40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
10d50 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
10d60 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
10d70 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
10d80 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
10d90 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
10da0 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
10db0 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
10dc0 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
10dd0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10de0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
10df0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
10e00 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
10e10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10e20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
10e30 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
10e40 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10e50 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10e60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10e70 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10e80 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10e90 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10ea0 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10eb0 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10ec0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10ed0 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10ee0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
10ef0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
10f00 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10f10 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10f20 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
10f30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10f40 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
10f50 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
10f60 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
10f70 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
10f80 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
10f90 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
10fa0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
10fb0 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
10fc0 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
10fd0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
10fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10ff0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
11000 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
11010 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
11020 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
11030 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
11040 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
11050 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
11060 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
11070 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
11080 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11090 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
110a0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
110b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
110c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
110d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
110e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
110f0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11100 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11110 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11120 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
11130 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11140 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11170 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
11180 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11190 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
111a0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
111b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
111c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
111d0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
111e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
111f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11200 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
11210 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
11220 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11230 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11240 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11250 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11260 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
11270 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
11280 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
11290 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
112a0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
112b0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
112c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
112d0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
112e0 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
112f0 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
11300 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
11310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11320 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
11330 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11340 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11350 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11360 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11370 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
11380 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
11390 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
113a0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
113b0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
113c0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
113d0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
113e0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
113f0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
11400 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
11410 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11420 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11430 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11440 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11450 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11460 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11470 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
11490 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
114a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114b0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
114c0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
114d0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
114e0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
114f0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
11500 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
11510 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
11520 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
11530 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
11540 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
11550 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11560 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11570 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
11580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11590 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
115a0 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
115b0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
115c0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
115d0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
115e0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
115f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
11600 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
11610 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
11620 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
11630 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
11640 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
11650 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
11660 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11670 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
11680 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
11690 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
116a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
116b0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
116c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
116d0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
116e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
116f0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
11700 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11710 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
11720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11730 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
11740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11750 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11760 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
11770 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
11780 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
11790 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
117a0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
117b0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
117c0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
117d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
117e0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
117f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11800 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11810 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
11820 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
11830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11840 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11850 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
11860 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
11870 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11880 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
118a0 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
118b0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
118c0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
118d0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11920 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
11930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11970 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11990 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
119a0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
119b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
119d0 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
119e0 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
119f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
11a00 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
11a10 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
11a20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
11a30 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
11a40 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
11a50 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
11a60 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
11a70 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
11a80 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
11a90 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
11aa0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
11ab0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
11ac0 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
11ad0 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
11ae0 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
11af0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
11b00 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
11b10 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
11b20 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
11b30 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
11b40 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
11b50 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
11b60 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
11b70 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b80 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
11b90 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
11ba0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
11bb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11bc0 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
11bd0 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
11be0 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
11bf0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
11c00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
11c10 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
11c20 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  S../*.** Retry f
11c30 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
11c40 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
11c50 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
11c60 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
11c70 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
11c80 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
11c90 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
11ca0 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
11cb0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
11cc0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
11cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
11ce0 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
11cf0 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
11d00 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
11d10 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
11d20 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11d30 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11d40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11d50 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11d60 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11d70 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11d80 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11d90 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11da0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11db0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11dc0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11dd0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11de0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11df0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11e00 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11e10 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11e20 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11e30 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11e50 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
11e60 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11e70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11e80 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
11e90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11ea0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11eb0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11ec0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11ed0 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
11ee0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11ef0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
11f00 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
11f10 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
11f20 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
11f30 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
11f40 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11f50 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11f60 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11f70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11f80 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
11f90 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
11fa0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
11fb0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
11fc0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
11fd0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
11fe0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
11ff0 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
12000 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
12010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
12020 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12030 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12040 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
12050 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
12060 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
12070 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
12080 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
12090 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
120a0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
120b0 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
120c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
120d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
120e0 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
120f0 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
12100 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
12110 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12120 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
12130 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12140 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12150 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12160 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12170 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12180 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
12190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
121a0 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
121b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
121c0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
121d0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
121e0 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
121f0 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
12200 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
12210 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12220 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12230 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12240 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
12250 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12260 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
12270 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12280 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
12290 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
122a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
122b0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
122c0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
122d0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
122e0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
122f0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
12300 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12310 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
12320 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12330 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12340 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12360 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
12370 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12380 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12390 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
123a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
123b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
123c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
123d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
123e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
123f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
12400 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
12410 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12420 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12430 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12440 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12450 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12460 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12470 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12480 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12490 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
124a0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
124b0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
124c0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
124d0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
124e0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
124f0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12500 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12510 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12520 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12530 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12540 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12550 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12560 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12570 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12580 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12590 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
125a0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
125b0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
125c0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
125d0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
125e0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
125f0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12600 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12610 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12620 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12630 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12640 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12650 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12660 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12670 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
12680 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
12690 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
126a0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
126b0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
126c0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
126d0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
126e0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
126f0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
12700 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
12710 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
12720 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
12730 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
12740 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
12750 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
12760 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
12770 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
12780 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12790 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
127a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
127b0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
127c0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
127d0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
127e0 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
127f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12800 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12820 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
12830 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12840 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
12850 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
12860 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
12870 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
12880 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
12890 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
128a0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
128b0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
128c0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
128d0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
128e0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
128f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12900 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
12910 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12920 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
12930 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12940 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
12950 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12960 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
12970 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
12980 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12990 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
129a0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
129b0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
129c0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
129d0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
129e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
129f0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
12a00 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12a10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12a20 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
12a40 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
12a50 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12a60 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12a70 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12a80 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12a90 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
12aa0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
12ab0 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
12ac0 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
12ad0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
12af0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
12b00 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
12b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
12b20 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12b30 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
12b40 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
12b50 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
12b60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12b70 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
12b80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12b90 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12ba0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
12bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
12bc0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
12bd0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
12be0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
12bf0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
12c00 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
12c10 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
12c20 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
12c30 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
12c40 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12c50 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
12c60 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
12c70 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
12c80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
12c90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
12ca0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12cb0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
12cc0 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
12cd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12ce0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
12cf0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
12d00 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12d10 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
12d20 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12d30 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12d40 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12d50 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
12d60 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
12d70 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
12d80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12d90 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
12da0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
12db0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
12dc0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
12dd0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
12de0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
12df0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
12e00 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
12e10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12e20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
12e30 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
12e40 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
12e50 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
12e60 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
12e70 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
12e80 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12e90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12ea0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
12eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12ec0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12ed0 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
12ee0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
12ef0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12f00 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
12f10 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12f20 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
12f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12f40 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
12f50 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12f60 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12f70 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
12f80 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12f90 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
12fa0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12fb0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
12fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12fd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
12fe0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
12ff0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13000 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13010 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
13020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13030 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13040 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
13050 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63  NO_LOCK);.    rc
13060 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13070 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13080 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
13090 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
130a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
130b0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
130c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
130d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
130e0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
130f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
131c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
131d0 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
131e0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
131f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13200 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13210 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13220 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13230 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13240 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13250 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13260 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13270 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13280 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
13290 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
132a0 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
132b0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
132c0 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
132d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
132e0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
132f0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13300 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13310 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13320 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13330 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13340 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13350 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13370 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13380 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13390 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
133a0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
133b0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
133c0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
133d0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
133e0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
133f0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13400 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13410 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13420 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13430 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13440 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13450 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13460 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13470 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13480 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13490 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
134a0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
134b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
134c0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
134d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
134e0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
134f0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13500 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13510 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
13520 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
13530 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13540 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
13550 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
13560 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
13570 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
13580 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
13590 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
135a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
135b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
135c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
135d0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
135e0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
135f0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
13600 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13610 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
13620 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
13630 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
13640 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
13650 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75  ->pSem;.    stru
13660 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
13670 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72  ..    if( sem_tr
13680 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
13690 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
136a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
136b0 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d     if( EAGAIN !=
136c0 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
136d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
136e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
136f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
13700 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
13710 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
13720 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13730 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13740 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13750 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
13760 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
13770 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
13780 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
13790 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
137a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
137b0 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
137c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
137d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
137e0 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
137f0 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
13800 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
13810 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
13820 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13830 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13840 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
13850 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
13860 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
13870 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
13880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13890 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
138a0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
138b0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
138c0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
138d0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
138e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
138f0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13900 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13910 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13920 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13930 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13940 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13950 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13960 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13970 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
13980 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
13990 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
139a0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
139b0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
139c0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
139d0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
139e0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
139f0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
13a00 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
13a10 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
13a20 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
13a30 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
13a40 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
13a50 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
13a60 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
13a70 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
13a80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
13a90 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
13aa0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
13ab0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
13ac0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
13ad0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
13ae0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13af0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13b00 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
13b10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13b20 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
13b30 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
13b40 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
13b50 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
13b60 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
13b70 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
13b80 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
13b90 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
13ba0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
13bb0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
13bc0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
13bd0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
13be0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
13bf0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
13c00 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
13c10 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
13c20 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
13c30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
13c40 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13c50 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13c60 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
13c70 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
13c80 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
13c90 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
13ca0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13cb0 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   semLock(sqlite3
13cc0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13cd0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13ce0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13cf0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13d00 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
13d10 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13d20 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
13d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13d40 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
13d50 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
13d60 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
13d70 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
13d80 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
13d90 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
13da0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
13db0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13dc0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
13dd0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13de0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13e00 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
13e10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
13e20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
13e30 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
13e40 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
13e50 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
13e60 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
13e70 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
13e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
13e90 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
13ea0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
13eb0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13ec0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13ed0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13ef0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
13f00 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
13f10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13f20 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13f30 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13f40 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
13f50 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
13f60 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13f70 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13f80 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13f90 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13fa0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13fb0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13fc0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13fd0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13fe0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13ff0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14010 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14020 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73   int semUnlock(s
14030 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14040 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14050 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14060 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14070 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
14080 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14090 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
140a0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
140b0 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
140c0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
140d0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
140e0 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
140f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
14100 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
14110 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14120 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
14130 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
14140 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
14150 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
14160 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
14170 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14180 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
14190 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
141a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
141b0 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
141c0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
141d0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
141e0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
141f0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
14200 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
14210 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14220 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14230 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
14240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14250 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
14260 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
14270 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
14280 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
14290 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
142a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
142b0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
142c0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
142d0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
142e0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
142f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
14300 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
14310 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14320 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
14330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
14340 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
14350 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
14360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
14380 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
14390 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
143a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
143b0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
143c0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
143d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
143e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
143f0 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
14400 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
14410 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
14420 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
14430 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
14440 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
14450 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14460 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
14470 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
14480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14490 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
144a0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
144b0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
144c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
144d0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
144e0 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
14500 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
14510 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
14520 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14600 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14630 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
14640 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
14650 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
14660 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
14670 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
14680 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
14690 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
146a0 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
146b0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
146c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
146d0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
146e0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
146f0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
14700 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
14710 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
14720 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
14730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
14740 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
14750 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
14760 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
14770 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
14780 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
14790 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
147a0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
147b0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
147c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
147d0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
147e0 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
147f0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
14800 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
14810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
14820 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
14830 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
14840 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
14850 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
14860 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
14870 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
14880 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
14890 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
148a0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
148b0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
148c0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
148d0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
148e0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
148f0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
14900 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
14910 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
14920 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
14930 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
14940 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
14950 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
14960 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14970 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
14980 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
14990 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
149a0 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
149b0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
149e0 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
149f0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
14a00 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
14a10 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
14a20 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
14a30 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
14a40 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
14a50 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
14a60 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
14a70 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
14a80 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
14a90 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
14aa0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
14ab0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
14ac0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
14ad0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
14ae0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
14af0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
14b00 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
14b10 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
14b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14b30 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
14b40 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
14b50 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
14b60 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
14b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
14b80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14b90 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
14ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
14bb0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
14bc0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
14bd0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
14be0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14bf0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
14c00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
14c10 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
14c20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
14c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14c40 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
14c50 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
14c60 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
14c70 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
14c80 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
14c90 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
14ca0 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
14cb0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
14cc0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
14cd0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
14ce0 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
14cf0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
14d00 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
14d10 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
14d20 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
14d30 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
14d40 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
14d50 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
14d60 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
14d70 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
14d80 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
14d90 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
14da0 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
14db0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
14dc0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
14dd0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
14de0 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
14df0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
14e00 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
14e10 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
14e20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
14e30 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
14e40 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
14e50 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
14e60 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
14e70 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
14e80 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
14e90 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
14ea0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
14eb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14ec0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
14ed0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14ee0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14ef0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14f00 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
14f10 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
14f20 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
14f30 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
14f40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14f50 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
14f60 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
14f70 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14f80 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
14f90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14fa0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
14fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14fc0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
14fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
14ff0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
15000 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
15010 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
15020 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
15030 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
15040 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
15050 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
15060 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
15070 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
15080 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
15090 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
150a0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
150b0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
150c0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
150d0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
150e0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
150f0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15100 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
15110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15120 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
15130 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15140 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
15150 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
15160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15170 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15180 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15190 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
151a0 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
151b0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
151c0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
151d0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
151e0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
151f0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15200 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15210 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
15220 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
15230 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
15240 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
15250 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
15260 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
15270 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
15280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15290 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
152a0 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
152b0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
152c0 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
152d0 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
152e0 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
152f0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
15300 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
15310 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
15320 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
15330 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
15340 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15350 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15360 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
15370 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
15380 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
15390 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
153a0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
153b0 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
153c0 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
153d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
153e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
153f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15400 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
15410 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
15420 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
15430 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
15440 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
15450 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
15460 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
15470 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
15480 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
15490 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
154a0 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
154b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
154c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
154d0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
154e0 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
154f0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
15500 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
15510 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
15520 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
15530 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
15540 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
15550 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
15560 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
15570 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
15580 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
15590 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
155a0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
155b0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
155c0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
155d0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
155e0 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
155f0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
15600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15610 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
15620 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
15630 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
15640 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
15650 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
15660 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
15670 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
15680 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
15690 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
156a0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
156b0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
156c0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
156d0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
156e0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
156f0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
15700 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
15710 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
15720 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
15730 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
15740 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
15750 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
15760 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
15770 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
15780 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
15790 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
157a0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
157b0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
157c0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
157d0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
157e0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
157f0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
15800 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
15810 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
15820 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
15830 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
15840 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
15850 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
15860 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
15870 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
15880 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
15890 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
158a0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
158b0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
158c0 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
158d0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
158e0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
158f0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
15900 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
15910 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
15920 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15940 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
15950 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15960 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
15970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15990 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
159a0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
159b0 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
159c0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
159d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
159e0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
159f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
15a00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
15a10 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
15a20 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15a30 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15a40 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
15a50 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
15a60 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
15a70 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15a80 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
15a90 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
15aa0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
15ab0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15ac0 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
15ad0 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
15ae0 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
15af0 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
15b00 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
15b10 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
15b20 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
15b30 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
15b40 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
15b50 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
15b60 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
15b70 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
15b80 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
15b90 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
15ba0 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
15bb0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
15bc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
15bd0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
15be0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
15bf0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
15c00 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
15c10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
15c20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15c30 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
15c40 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
15c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15c60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15c70 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
15c80 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
15c90 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
15ca0 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
15cb0 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
15cc0 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
15cd0 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
15ce0 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
15cf0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
15d00 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
15d10 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
15d20 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
15d30 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
15d40 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
15d50 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
15d60 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15d70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
15d80 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
15d90 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15da0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15db0 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
15dc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
15dd0 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
15de0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
15df0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
15e00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15e10 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
15e20 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
15e30 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15e40 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15e50 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
15e60 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15e70 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
15e80 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
15e90 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
15ea0 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
15eb0 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
15ec0 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
15ed0 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
15ee0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
15ef0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
15f00 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
15f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
15f20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
15f30 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15f40 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
15f50 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
15f60 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
15f70 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
15f80 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
15f90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15fa0 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
15fb0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15fc0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
15fd0 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
15fe0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
15ff0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
16000 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
16010 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
16020 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
16030 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
16040 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
16050 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
16060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
16070 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16080 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16090 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
160a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
160b0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
160c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
160d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
160e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
160f0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16100 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
16110 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
16120 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
16130 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16140 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
16150 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16160 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16170 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
16180 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
16190 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
161a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
161b0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
161c0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
161d0 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
161e0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
161f0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
16200 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
16210 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
16220 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
16230 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
16240 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
16250 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
16260 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16270 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16280 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
16290 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
162a0 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
162b0 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
162c0 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
162d0 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
162e0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
162f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16300 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
16310 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
16320 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
16330 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
16340 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
16350 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16360 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
16370 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
16380 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
16390 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
163a0 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
163b0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
163c0 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
163d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
163e0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
163f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16400 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
16410 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
16420 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
16430 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
16440 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
16450 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16460 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16470 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16480 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
16490 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
164a0 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
164b0 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
164c0 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
164d0 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
164e0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
164f0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
16500 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
16510 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
16520 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
16530 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
16540 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
16550 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
16560 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16570 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
16580 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16590 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
165a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
165b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
165c0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
165d0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
165e0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
165f0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16600 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
16610 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
16620 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
16630 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
16640 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
16650 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
16660 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
16670 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16680 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16690 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
166a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
166b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
166c0 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
166d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
166e0 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
166f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
16700 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
16710 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
16720 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
16730 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
16740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
16750 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
16760 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
16770 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
16780 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
16790 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
167a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
167b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
167c0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
167d0 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
167e0 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
167f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
16800 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
16810 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
16820 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16830 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
16840 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
16850 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
16860 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
16870 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
16880 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
16890 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
168a0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
168b0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
168c0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
168d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
168f0 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
16900 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
16910 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16920 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
16930 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
16940 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
16950 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
16960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
16970 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
16980 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
16990 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
169a0 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
169b0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
169c0 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
169d0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
169e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
169f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
16a00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
16a10 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
16a20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16a30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16a40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16a50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16a60 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16a70 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
16a80 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
16a90 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16aa0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16ab0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
16ac0 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
16ad0 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
16ae0 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
16af0 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
16b00 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
16b10 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
16b20 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
16b30 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
16b40 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
16b50 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
16b60 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
16b70 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16b80 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
16b90 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
16ba0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16bb0 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
16bc0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16bd0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16be0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
16bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c00 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
16c10 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16c20 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
16c30 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
16c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16c50 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
16c60 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
16c70 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
16c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
16c90 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16ca0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16cb0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
16cc0 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16cf0 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
16d00 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
16d10 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
16d20 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16d30 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
16d60 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
16d70 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
16d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
16d90 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
16da0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
16db0 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
16dc0 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16dd0 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16de0 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16df0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16e00 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
16e10 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16e20 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
16e30 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
16e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16e60 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
16e70 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16e80 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
16e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ea0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
16eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16ec0 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16ed0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16f00 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16f10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16f20 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
16f30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
16f40 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
16f50 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16f60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16f70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16f80 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
16f90 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
16fa0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
16fb0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16fc0 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
16fd0 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
16fe0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16ff0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
17000 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
17010 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
17020 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
17030 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
17040 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
17050 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
17060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17070 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17080 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17090 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
170a0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
170b0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
170c0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
170d0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
170e0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
170f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17100 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17110 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17120 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
17130 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
17140 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
17150 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17160 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17170 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
17180 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17190 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
171a0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
171b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
171c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
171d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
171e0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
171f0 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
17200 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
17210 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
17220 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
17230 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
17240 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
17250 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
17260 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
17270 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
17280 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
17290 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
172a0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
172b0 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
172c0 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
172d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
172e0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
172f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17300 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17310 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
17320 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
17330 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
17340 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
17350 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17360 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
17370 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
17380 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
17390 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
173a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
173b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
173c0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
173d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
173e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
173f0 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
17400 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17410 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
17420 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
17430 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17440 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
17450 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
17460 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17470 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
17480 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
17490 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
174a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
174b0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
174c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
174d0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
174e0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
174f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
17500 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
17510 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
17520 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
17530 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
17540 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
17550 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
17560 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
17570 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
17580 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
17590 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
175a0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
175b0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
175c0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
175d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
175e0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
175f0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
17600 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
17610 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
17620 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
17630 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
17640 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
17650 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
17660 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
17670 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
17680 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
17690 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
176a0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
176b0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
176c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
176d0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
176e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
176f0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
17700 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
17710 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
17720 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
17730 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
17740 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
17750 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17760 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
17770 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17780 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17790 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
177a0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
177b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
177c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
177d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
177e0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
177f0 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
17800 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
17810 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17820 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
17830 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
17840 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
17850 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
17860 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
17870 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
17880 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17890 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
178a0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
178b0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
178c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
178d0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
178e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
178f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
17910 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
17920 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
17930 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17940 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17950 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
17960 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
17970 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
17980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17990 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
179a0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
179b0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
179c0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
179d0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
179e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
179f0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17a00 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
17a10 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
17a20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
17a30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
17a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a60 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
17a70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
17a80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17a90 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
17aa0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17ab0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
17ac0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
17ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
17ae0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
17af0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
17b00 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
17b10 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
17b20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
17b30 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
17b40 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
17b50 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
17b60 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
17b70 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
17b80 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
17b90 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
17ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
17bb0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
17bc0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
17bd0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17be0 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
17bf0 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
17c00 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17c10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
17c20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17c30 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
17c40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
17c50 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
17c60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17c70 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
17c80 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
17c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
17ca0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17cb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17cc0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
17cd0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
17ce0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
17cf0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
17d00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
17d10 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
17d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17d30 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
17d40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17d60 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17d70 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
17d80 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
17d90 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
17da0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
17db0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
17dc0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
17dd0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
17de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
17df0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17e00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17e10 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
17e20 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17e30 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
17e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
17e50 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
17e60 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
17e70 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
17e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17e90 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
17ea0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
17eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17ec0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
17ed0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17ee0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17ef0 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
17f00 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
17f10 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17f20 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
17f30 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
17f40 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
17f50 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
17f60 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
17f70 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
17f80 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
17f90 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
17fa0 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
17fb0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
17fc0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
17fd0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
17fe0 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
17ff0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
18000 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
18010 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
18020 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
18030 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
18040 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
18050 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
18060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
18070 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
18080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
18090 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
180a0 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
180b0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
180c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
180d0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
180e0 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
180f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18110 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18120 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18130 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18140 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18150 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18160 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
18170 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18180 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18190 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
181a0 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
181b0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
181c0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
181d0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
181e0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
181f0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
18200 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18210 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
18220 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
18230 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
18240 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18260 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
18270 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18280 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18290 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
182f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18330 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18350 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18360 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18380 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
18390 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
183a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
183b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
183c0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
183d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
183e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
183f0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
18400 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
18410 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
18420 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18430 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
18440 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
18450 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18460 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18470 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18480 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
18490 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
184a0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
184b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
184c0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
184d0 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
184e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
184f0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
18500 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
18510 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
18520 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
18530 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18540 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18550 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18560 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
18570 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
18580 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
18590 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
185a0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
185b0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
185c0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
185d0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
185e0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
185f0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
18600 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
18610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18620 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18630 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18640 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
186b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
18720 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
18730 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
18740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18750 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
18760 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
18770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18780 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
18790 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
187a0 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
187b0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
187c0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
187d0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
187e0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
187f0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
18800 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
18810 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
18820 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
18830 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
18840 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
18850 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
18860 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
18870 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
18880 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
18890 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
188a0 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
188b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
188c0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
188d0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
188e0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
188f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18900 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
18910 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
18920 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
18930 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
18940 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
18950 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
18960 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
18970 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
18980 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
18990 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
189a0 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
189b0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
189c0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
189d0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
189e0 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
189f0 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
18a00 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
18a10 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
18a20 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
18a30 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
18a40 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
18a50 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
18a60 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
18a70 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
18a80 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
18a90 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
18aa0 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
18ab0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
18ac0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
18ad0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
18ae0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
18af0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
18b00 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
18b10 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20  ot;.  int prior 
18b20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  = 0;.#if (!defin
18b30 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
18b40 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
18b50 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
18b60 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
18b70 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
18b80 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63   assert( cnt==(c
18b90 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  nt&0x1ffff) );. 
18ba0 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66 3b   cnt &= 0x1ffff;
18bb0 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
18bc0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
18bd0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28    got = osPread(
18be0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18bf0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
18c00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18c10 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
18c20 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18c30 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d  EAD64).    got =
18c40 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
18c50 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18c60 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
18c70 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18c80 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20   -1 );.#else.   
18c90 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18ca0 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18cb0 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
18cc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18cd0 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
18ce0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
18cf0 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
18d00 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
18d10 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
18d20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18d30 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18d40 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c  errno;.      }el
18d50 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e  se{.        ((un
18d60 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18d70 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  tErrno = 0;.    
18d80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
18d90 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
18da0 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
18db0 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
18dc0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
18dd0 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
18de0 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
18df0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
18e00 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
18e10 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
18e20 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
18e30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
18e40 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18e50 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
18e70 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20  e if( got>0 ){. 
18e80 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b       cnt -= got;
18e90 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
18ea0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f   got;.      prio
18eb0 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  r += got;.      
18ec0 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67  pBuf = (void*)(g
18ed0 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66  ot + (char*)pBuf
18ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
18ef0 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49  e( got>0 );.  TI
18f00 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
18f10 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE(("READ    %-3
18f20 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
18f30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18f40 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f   id->h, got+prio
18f50 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c  r, offset-prior,
18f60 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
18f70 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70  ;.  return got+p
18f80 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rior;.}../*.** R
18f90 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
18fa0 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
18fb0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
18fc0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
18fd0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
18fe0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
18ff0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
19000 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
19010 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
19020 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
19030 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19040 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
19050 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
19060 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19070 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
19080 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19090 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
190a0 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
190b0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
190c0 74 28 20 6f 66 66 73 65 74 3e 3d 70 46 69 6c 65  t( offset>=pFile
190d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 20 20 2f  ->mmapSize );  /
190e0 2a 20 4e 65 76 65 72 20 72 65 61 64 20 66 72 6f  * Never read fro
190f0 6d 20 74 68 65 20 6d 6d 61 70 70 65 64 20 72 65  m the mmapped re
19100 67 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  gion */..  /* If
19110 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
19120 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
19130 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
19140 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
19150 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
19160 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
19170 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
19180 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
19190 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
191a0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
191b0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
191c0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
191d0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
191e0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
191f0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
19200 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
19210 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
19220 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19230 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
19240 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
19250 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
19260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
19270 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
19280 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
19290 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
192a0 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
192b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
192c0 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
192d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
192e0 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
192f0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
19300 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
19310 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
19320 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
19330 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
19340 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
19350 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
19360 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
19370 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19380 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
19390 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
193a0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
193b0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
193c0 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
193d0 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
193e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
193f0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
19400 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
19410 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
19420 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
19430 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
19440 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
19450 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
19460 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19470 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
19480 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19490 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
194a0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
194b0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
194c0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
194d0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
194e0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
194f0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
19500 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
19510 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
19520 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  et;.#endif.  ass
19530 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
19540 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e 74  x1ffff) );.  cnt
19550 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54   &= 0x1ffff;.  T
19560 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
19570 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19580 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
19590 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  sPwrite(id->h, p
195a0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
195b0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
195c0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
195d0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
195e0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
195f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
19600 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
19610 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19620 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
19630 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
19640 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
19650 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
19660 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
19670 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
19680 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19690 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
196a0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
196b0 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
196c0 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
196d0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
196e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
196f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
19700 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rrno;.      }els
19710 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  e{.        ((uni
19720 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19730 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Errno = 0;.     
19740 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
19750 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  -1;.    }.    go
19760 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e  t = osWrite(id->
19770 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20  h, pBuf, cnt);. 
19780 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
19790 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
197a0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
197b0 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
197c0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
197d0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
197e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
197f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
19800 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
19810 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
19820 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
19830 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
19840 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
19850 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
19860 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
19870 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
19880 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19890 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
198a0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
198b0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
198c0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
198d0 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
198e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
198f0 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
19900 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19910 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19920 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
19930 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19940 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19950 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
19960 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
19970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
19980 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19990 6f 66 66 73 65 74 3e 3d 70 46 69 6c 65 2d 3e 6d  offset>=pFile->m
199a0 6d 61 70 53 69 7a 65 20 29 3b 20 20 20 2f 2a 20  mapSize );   /* 
199b0 4e 65 76 65 72 20 77 72 69 74 65 20 69 6e 74 6f  Never write into
199c0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 72 65 67   the mmapped reg
199d0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ion */..  /* If 
199e0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
199f0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
19a00 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
19a10 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
19a20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
19a30 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
19a40 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
19a50 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
19a60 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
19a70 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
19a80 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
19a90 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19aa0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
19ab0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
19ac0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
19ad0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
19ae0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
19af0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
19b00 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
19b10 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
19b20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19b30 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
19b40 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
19b50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
19b60 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
19b70 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
19b80 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
19b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
19ba0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
19bb0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
19bc0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
19bd0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
19be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19bf0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
19c00 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
19c10 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
19c20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
19c30 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
19c40 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
19c50 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
19c60 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
19c70 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
19c80 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
19c90 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
19ca0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
19cb0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
19cc0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
19cd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19ce0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19cf0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
19d00 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
19d10 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
19d20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19d30 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
19d40 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
19d50 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
19d60 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
19d70 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
19d80 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
19d90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
19da0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
19db0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19dc0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
19dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19de0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
19df0 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
19e00 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
19e10 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19e20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
19e30 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
19e40 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
19e50 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
19e60 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
19e70 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
19e80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19e90 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
19ea0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
19eb0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19ec0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
19ed0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
19ee0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
19ef0 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
19f00 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
19f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
19f20 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
19f30 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
19f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19f50 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
19f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19f80 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
19f90 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19fb0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19fc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
19fe0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
19ff0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1a000 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1a010 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1a020 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1a030 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1a040 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1a050 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1a060 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1a070 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1a080 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1a090 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1a0a0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1a0b0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1a0c0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1a0d0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1a0e0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1a0f0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1a100 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1a110 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1a120 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1a130 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1a140 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1a150 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1a160 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1a170 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1a180 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1a190 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1a1a0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1a1b0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1a1c0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
1a1d0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1a1e0 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
1a1f0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1a200 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1a210 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1a220 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1a230 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1a240 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1a250 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1a260 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1a270 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1a280 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1a290 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1a2a0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1a2b0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1a2c0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1a2d0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1a2e0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a2f0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1a300 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a310 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1a320 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1a330 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1a340 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1a350 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1a360 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1a370 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1a380 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1a390 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1a3a0 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1a3b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1a3c0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1a3d0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1a3e0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1a3f0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1a400 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1a410 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1a420 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1a430 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1a440 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1a450 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1a460 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1a470 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1a480 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1a490 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1a4a0 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1a4b0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1a4c0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1a4d0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1a4e0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1a4f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1a500 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1a510 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1a520 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a530 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1a540 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1a550 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1a560 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1a570 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1a580 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1a590 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1a5a0 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1a5b0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1a5c0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1a5d0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1a5e0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1a5f0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1a600 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1a610 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1a620 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1a630 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1a640 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1a650 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1a660 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1a670 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1a680 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1a690 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1a6a0 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1a6b0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1a6c0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1a6d0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1a6e0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1a6f0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1a700 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1a710 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1a720 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1a730 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1a740 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1a750 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1a760 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1a770 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1a780 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1a790 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1a7a0 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1a7b0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1a7c0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1a7d0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1a7e0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1a7f0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1a800 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1a810 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1a820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a830 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1a840 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1a850 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1a860 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1a870 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1a880 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1a890 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1a8a0 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1a8b0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1a8c0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1a8d0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1a8e0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1a8f0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1a900 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1a910 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1a920 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1a930 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1a940 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1a950 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a960 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a970 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1a980 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a990 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1a9a0 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1a9b0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1a9c0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1a9d0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1a9e0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1a9f0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1aa00 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1aa10 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1aa20 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1aa30 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1aa40 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1aa50 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1aa60 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1aa70 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1aa80 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1aa90 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1aaa0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1aab0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1aac0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1aad0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1aae0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1aaf0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1ab00 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1ab10 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1ab20 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1ab30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1ab40 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1ab50 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1ab60 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1ab70 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1ab80 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1ab90 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1aba0 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1abb0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1abc0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1abd0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1abe0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1abf0 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1ac00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1ac10 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1ac20 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1ac30 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1ac40 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1ac50 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1ac60 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1ac70 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1ac80 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1ac90 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1aca0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1acb0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1acc0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1acd0 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1ace0 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1acf0 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1ad00 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1ad10 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1ad20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1ad30 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1ad40 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1ad50 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1ad60 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1ad70 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1ad80 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1ad90 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1ada0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1adb0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1adc0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1add0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1ade0 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1adf0 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1ae00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1ae10 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1ae20 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1ae30 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1ae40 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1ae50 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1ae60 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1ae70 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1ae80 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1ae90 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1aea0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1aeb0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1aec0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1aed0 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1aee0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1aef0 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1af00 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1af10 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1af20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1af30 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1af40 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1af50 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1af60 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1af70 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1af80 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1af90 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1afa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1afb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1afc0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1afd0 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1afe0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1aff0 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1b000 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b010 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1b020 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1b030 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1b040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b050 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1b060 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1b070 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1b080 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1b090 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1b0a0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1b0b0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1b0c0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1b0d0 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1b0e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1b0f0 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1b100 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1b110 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1b120 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1b130 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1b140 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1b150 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1b160 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1b170 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1b180 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1b190 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1b1a0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1b1b0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1b1c0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1b1d0 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1b1e0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1b1f0 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1b200 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1b210 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1b220 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1b230 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1b240 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1b250 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1b260 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1b270 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1b280 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1b290 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1b2a0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1b2b0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1b2c0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1b2d0 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1b2e0 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1b2f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1b300 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1b310 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1b320 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1b330 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1b340 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1b350 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1b360 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1b370 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1b380 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1b390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1b3a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b3b0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1b3c0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1b3d0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1b3e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b3f0 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1b400 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1b410 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1b420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b430 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1b440 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1b450 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1b460 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1b470 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1b480 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1b490 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1b4a0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1b4b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1b4c0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1b4d0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1b4e0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1b4f0 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1b500 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1b510 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1b520 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1b530 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1b540 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1b550 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1b560 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  fd>=0 ){.      O
1b570 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1b580 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1b590 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1b5a0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1b5b0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1b5c0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1b5d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1b5e0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1b5f0 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1b600 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1b610 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1b620 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1b630 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1b640 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1b650 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1b660 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1b670 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1b680 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1b690 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1b6a0 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1b6b0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1b6c0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1b6d0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1b6e0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1b6f0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1b700 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1b710 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1b720 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1b730 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1b740 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1b750 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1b760 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1b770 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1b780 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1b790 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1b7a0 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1b7b0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1b7c0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1b7d0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1b7e0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1b7f0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1b800 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1b810 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1b820 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1b830 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1b840 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1b850 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1b860 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1b870 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1b880 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1b890 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1b8a0 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1b8b0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1b8c0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1b8d0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1b8e0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1b8f0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1b900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b910 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1b920 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1b930 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1b940 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1b950 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1b960 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1b970 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1b980 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1b990 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1b9a0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1b9b0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1b9c0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1b9d0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1b9e0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1b9f0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1ba00 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1ba10 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1ba20 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1ba30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1ba40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1ba50 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1ba60 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1ba70 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1ba80 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1ba90 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1baa0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1bab0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1bac0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1bad0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1bae0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1baf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1bb00 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1bb10 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1bb20 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1bb30 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1bb40 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1bb50 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1bb60 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1bb70 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1bb80 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1bb90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1bba0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1bbb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1bbc0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1bbd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1bbe0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1bbf0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1bc00 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1bc10 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1bc20 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1bc30 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1bc40 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1bc50 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1bc60 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1bc70 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61   occurrance.  Ma
1bc80 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1bc90 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1bca0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1bcb0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1bcc0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1bcd0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1bce0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1bcf0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1bd00 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1bd10 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1bd20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1bd30 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1bd40 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1bd50 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1bd60 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1bd70 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1bd80 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1bd90 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1bda0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1bdb0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1bdc0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1bdd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1bde0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1bdf0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1be00 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1be10 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1be20 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1be30 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1be40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1be50 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1be60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1be70 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1be80 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1be90 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1bea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1beb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1bec0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1bed0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1bee0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1bef0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1bf00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1bf10 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1bf20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1bf30 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1bf40 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1bf50 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1bf60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bf70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1bf80 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1bf90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1bfa0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1bfb0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1bfc0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1bfd0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1bfe0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1bff0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1c000 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1c010 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1c020 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1c030 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1c040 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1c050 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1c060 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1c070 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1c080 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1c090 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1c0a0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1c0b0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1c0c0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1c0d0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c0e0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1c0f0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1c100 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1c110 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1c120 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1c130 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1c140 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1c150 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c160 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1c170 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1c180 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1c190 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1c1a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c1b0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1c1c0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1c1d0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1c1e0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1c1f0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1c200 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1c210 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1c220 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1c230 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1c240 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1c250 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1c260 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1c270 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1c280 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1c290 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1c2a0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1c2b0 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1c2c0 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1c2d0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1c2e0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1c2f0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1c300 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1c310 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1c320 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1c330 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1c340 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1c350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1c360 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1c370 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1c380 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1c390 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61   was just trunca
1c3a0 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
1c3b0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
1c3c0 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
1c3d0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
1c3e0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1c3f0 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
1c400 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
1c410 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   will.    ** use
1c420 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
1c430 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
1c440 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
1c450 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
1c460 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
1c470 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  f( nByte<pFile->
1c480 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1c490 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1c4a0 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d  e = nByte;.    }
1c4b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
1c4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c4d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1c4e0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1c4f0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1c500 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1c510 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1c520 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1c530 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1c540 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1c550 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1c560 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1c570 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
1c580 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1c590 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
1c5a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1c5b0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
1c5c0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
1c5d0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1c5e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c600 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
1c610 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
1c620 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
1c630 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
1c640 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
1c650 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e   the findInodeIn
1c660 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20  fo() procedure. 
1c670 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e   ** writes a sin
1c680 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68  gle byte into th
1c690 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  at file in order
1c6a0 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1c6b0 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68  a bug.  ** in th
1c6c0 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c  e OS-X msdos fil
1c6d0 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64  esystem.  In ord
1c6e0 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
1c6f0 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a  lems with upper.
1c700 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20    ** layers, we 
1c710 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  need to report t
1c720 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73  his file size as
1c730 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67   zero even thoug
1c740 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61  h it is.  ** rea
1c750 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20  lly 1.   Ticket 
1c760 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3260..  */.  if
1c770 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70  ( *pSize==1 ) *p
1c780 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65  Size = 0;...  re
1c790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c7a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1c7b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1c7c0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1c7d0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48  APPLE__)./*.** H
1c7e0 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79  andler for proxy
1c7f0 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f  -locking file-co
1c800 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65  ntrol verbs.  De
1c810 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74  fined below in t
1c820 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c  he.** proxying l
1c830 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e  ocking division.
1c840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1c850 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1c860 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1c870 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  t,void*);.#endif
1c880 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
1c890 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c8a0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53   to handle the S
1c8b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1c8c0 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63  _HINT .** file-c
1c8d0 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e  ontrol operation
1c8e0 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64  .  Enlarge the d
1c8f0 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65  atabase to nByte
1c900 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f  s in size.** (ro
1c910 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20  unded up to the 
1c920 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29  next chunk-size)
1c930 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1c940 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  se is already.**
1c950 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65   nBytes or large
1c960 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
1c970 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1c980 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
1c990 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
1c9a0 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
1c9b0 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  te){.  if( pFile
1c9c0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1c9d0 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20     i64 nSize;   
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c   /* Required fil
1ca00 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
1ca10 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20  ruct stat buf;  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1ca30 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75  sed to hold retu
1ca40 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74  rn values of fst
1ca50 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20  at() */.   .    
1ca60 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c  if( osFstat(pFil
1ca70 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65  e->h, &buf) ) re
1ca80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ca90 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53  R_FSTAT;..    nS
1caa0 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46  ize = ((nByte+pF
1cab0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20  ile->szChunk-1) 
1cac0 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  / pFile->szChunk
1cad0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1cae0 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  nk;.    if( nSiz
1caf0 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69  e>(i64)buf.st_si
1cb00 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  ze ){..#if defin
1cb10 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
1cb20 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
1cb30 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1cb40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1cb50 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64  de below is hand
1cb60 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  ling the return 
1cb70 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f  value of osFallo
1cb80 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a  cate() .      **
1cb90 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69   correctly. posi
1cba0 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73  x_fallocate() is
1cbb0 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74   defined to "ret
1cbc0 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63  urns zero on suc
1cbd0 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20  cess, .      ** 
1cbe0 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62  or an error numb
1cbf0 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e  er on  failure".
1cc00 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65   See the manpage
1cc10 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1cc20 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  .      int err;.
1cc30 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1cc40 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63    err = osFalloc
1cc50 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75  ate(pFile->h, bu
1cc60 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
1cc70 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  -buf.st_size);. 
1cc80 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72       }while( err
1cc90 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
1cca0 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72   if( err ) retur
1ccb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1ccc0 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1ccd0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1cce0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1ccf0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1cd00 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75  fake it. First u
1cd10 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75  se.      ** ftru
1cd20 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74  ncate() to set t
1cd30 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68  he file size, th
1cd40 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  en write a singl
1cd50 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20  e byte to.      
1cd60 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  ** the last byte
1cd70 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77   in each block w
1cd80 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64  ithin the extend
1cd90 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a  ed region. This.
1cda0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
1cdb0 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75  same technique u
1cdc0 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20  sed by glibc to 
1cdd0 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f  implement posix_
1cde0 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20  fallocate().    
1cdf0 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20    ** on systems 
1ce00 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1ce10 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74   a real fallocat
1ce20 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  e() system call.
1ce30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ce40 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73  int nBlk = buf.s
1ce50 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46  t_blksize;  /* F
1ce60 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b  ile-system block
1ce70 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69   size */.      i
1ce80 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20  64 iWrite;      
1ce90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1cea0 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69  xt offset to wri
1ceb0 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20  te to */..      
1cec0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1ced0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1cee0 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
1cef0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1cf00 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1cf10 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1cf20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1cf30 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1cf40 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1cf50 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1cf60 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  }.      iWrite =
1cf70 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
1cf80 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
1cf90 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
1cfa0 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e   while( iWrite<n
1cfb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1cfc0 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65  int nWrite = see
1cfd0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1cfe0 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1cff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1d000 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1d010 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1d020 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69  TE;.        iWri
1d030 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20  te += nBlk;.    
1d040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1d050 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1d060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d070 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
1d080 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
1d090 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1d0a0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1d0b0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1d0c0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1d0d0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1d0e0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1d0f0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1d100 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1d110 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1d120 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1d130 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1d140 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1d150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d160 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1d170 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1d180 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1d190 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1d1a0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1d1b0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1d1c0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1d1d0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1d1e0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1d1f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1d200 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1d210 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1d220 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1d230 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1d240 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1d250 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1d260 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1d270 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1d280 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1d290 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1d2a0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1d2b0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1d2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d2d0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1d2e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d2f0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1d300 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1d310 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d320 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1d330 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1d340 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1d350 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1d360 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1d370 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1d380 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1d390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d3a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d3b0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1d3c0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1d3d0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
1d3e0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1d3f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d400 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d410 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1d420 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
1d430 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
1d440 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
1d450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d460 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1d470 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1d480 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1d490 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1d4a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d4b0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1d4c0 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
1d4d0 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
1d4e0 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
1d4f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1d500 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1d510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d520 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d530 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1d540 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
1d550 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1d560 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1d570 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
1d580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d5a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d5b0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
1d5c0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
1d5d0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
1d5e0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
1d5f0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1d600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d620 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d630 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
1d640 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
1d650 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
1d660 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
1d670 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
1d680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d6a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d6b0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
1d6c0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
1d6d0 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
1d6e0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65  e3_malloc( pFile
1d6f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d700 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
1d710 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
1d720 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
1d730 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
1d740 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
1d750 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
1d760 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1d770 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1d780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d790 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1d7a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1d7b0 47 45 54 46 44 3a 20 7b 0a 20 20 20 20 20 20 2a  GETFD: {.      *
1d7c0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1d7d0 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 72 65 74  le->h;.      ret
1d7e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d7f0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1d800 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d810 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1d820 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1d830 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1d840 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1d850 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1d860 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1d870 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1d880 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1d890 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1d8a0 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1d8b0 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1d8c0 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1d8d0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1d8e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d8f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d900 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1d910 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1d920 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1d930 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d940 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1d950 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1d960 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d970 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1d980 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1d990 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
1d9a0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1d9b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
1d9c0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1d9d0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1d9e0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d9f0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1da00 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1da10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1da20 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1da30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1da40 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1da50 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1da60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1da70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1da80 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1da90 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1daa0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1dab0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1dac0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1dad0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1dae0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1daf0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1db00 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1db10 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1db20 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1db30 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1db40 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1db50 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1db60 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1db70 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1db80 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1db90 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1dba0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1dbb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1dbc0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1dbd0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1dbe0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1dbf0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1dc00 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1dc10 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1dc20 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1dc30 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1dc40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1dc50 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1dc60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1dc70 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1dc80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1dc90 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1dca0 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1dcb0 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1dcc0 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1dcd0 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1dce0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1dcf0 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1dd00 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1dd10 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1dd20 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1dd30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1dd40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1dd50 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1dd60 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1dd70 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1dd80 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1dd90 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1dda0 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1ddb0 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1ddc0 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1ddd0 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1dde0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ddf0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1de00 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1de10 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1de20 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1de30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1de40 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1de50 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1de60 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1de70 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1de80 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1de90 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1dea0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1deb0 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1dec0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ded0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1dee0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1def0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1df00 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1df10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1df20 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1df30 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1df40 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1df50 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1df60 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1df70 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1df80 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1df90 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1dfa0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1dfd0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1dfe0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1dff0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1e000 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1e010 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1e020 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1e030 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e060 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1e070 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1e080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1e090 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1e0a0 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1e0b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e0c0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1e0d0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1e0e0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1e0f0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1e100 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1e110 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1e120 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1e130 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1e140 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1e150 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1e160 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1e170 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e180 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1e190 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1e1a0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1e1b0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1e1f0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1e200 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1e210 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1e220 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1e230 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1e240 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1e280 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1e290 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1e2a0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1e2b0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1e2c0 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1e2d0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e2e0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1e2f0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1e300 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1e310 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1e320 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1e330 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1e340 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1e350 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1e360 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1e370 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1e380 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1e390 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1e3a0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1e3b0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1e3e0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1e3f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1e400 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e410 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e420 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e430 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e440 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e470 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e480 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e490 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1e4a0 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1e4b0 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1e4c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1e4d0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1e4e0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1e4f0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1e500 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1e510 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1e520 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1e530 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1e540 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1e550 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1e560 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e570 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1e580 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1e590 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1e5a0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1e5b0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1e5c0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1e5d0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1e5e0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1e620 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1e630 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1e640 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1e650 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1e660 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1e670 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1e680 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1e690 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1e6a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1e6b0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1e6c0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1e6d0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1e6e0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1e6f0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1e700 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1e710 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1e720 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1e730 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1e740 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1e750 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1e760 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1e770 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1e780 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1e790 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1e7c0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1e7d0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1e7f0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1e800 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1e810 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1e820 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1e830 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1e840 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1e850 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1e860 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1e870 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1e880 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1e890 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e8c0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1e8d0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1e8e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
1e8f0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
1e900 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
1e910 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1e920 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
1e930 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
1e940 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
1e950 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
1e960 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
1e970 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
1e980 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1e990 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1e9a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1e9b0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1e9c0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1e9d0 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1e9e0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e9f0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
1ea00 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
1ea10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ea20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1ea30 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1ea40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
1ea50 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
1ea60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ea70 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1ea80 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
1ea90 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
1eaa0 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
1eab0 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69  contraversial si
1eac0 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
1ead0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1eae0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
1eaf0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
1eb00 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
1eb10 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
1eb20 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
1eb30 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
1eb40 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
1eb50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
1eb60 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
1eb70 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
1eb80 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
1eb90 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
1eba0 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
1ebb0 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
1ebc0 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
1ebd0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
1ebe0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
1ebf0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
1ec00 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
1ec10 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
1ec20 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
1ec30 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
1ec40 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
1ec50 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
1ec60 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1ec70 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
1ec80 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
1ec90 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
1eca0 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1ecb0 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
1ecc0 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
1ecd0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1ece0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
1ecf0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1ed00 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1ed10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ed20 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1ed30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1ed40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1ed50 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1ed60 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
1ed70 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
1ed80 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
1ed90 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
1eda0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
1edb0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1edc0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1edd0 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
1ede0 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
1edf0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1ee00 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
1ee10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1ee20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ee30 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1ee40 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1ee50 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1ee60 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1ee70 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1ee80 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1ee90 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1eea0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1eeb0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1eec0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1eed0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1eee0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1eef0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1ef00 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1ef10 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1ef20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1ef30 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1ef40 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1ef50 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1ef60 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1ef70 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1ef80 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1ef90 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1efa0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1efb0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1efc0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1efd0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1efe0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1eff0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1f000 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1f010 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1f020 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1f030 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1f040 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1f050 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1f060 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1f070 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1f080 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1f090 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1f0a0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1f0b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1f0c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1f0d0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1f0e0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1f0f0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1f100 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1f110 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1f120 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1f130 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1f140 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1f150 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1f160 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1f170 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1f180 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1f190 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1f1a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1f1b0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1f1c0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1f1d0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1f1e0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1f1f0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1f200 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1f210 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1f220 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1f230 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1f240 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1f250 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1f260 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1f270 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1f280 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1f290 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1f2a0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1f2b0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1f2c0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1f2d0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1f2e0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1f2f0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1f300 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1f310 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1f320 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1f330 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1f340 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1f350 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1f360 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f370 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1f380 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1f3b0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1f3c0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1f3d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f3e0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1f3f0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1f400 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1f410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f420 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1f430 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1f440 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1f450 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1f460 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1f470 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1f480 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1f490 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1f4a0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1f4b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1f4e0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1f4f0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1f500 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1f510 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1f520 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1f530 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1f540 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1f550 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f560 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1f570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f580 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1f590 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1f5a0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1f5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f5c0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1f5d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1f5e0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1f5f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f600 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1f610 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1f620 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1f630 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1f640 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1f650 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1f660 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1f670 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1f680 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1f690 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1f6a0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1f6b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1f6c0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1f6d0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1f6e0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1f6f0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1f700 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1f710 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1f720 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1f730 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1f740 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1f750 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1f760 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1f770 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1f780 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1f790 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1f7a0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1f7b0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f7c0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1f7d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1f7e0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1f7f0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1f800 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1f810 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1f820 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1f830 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1f840 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1f850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f860 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1f870 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1f880 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
1f8b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
1f8c0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
1f8d0 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
1f8e0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1f8f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1f900 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1f910 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1f920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f930 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1f940 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1f950 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
1f960 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1f970 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1f980 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
1f990 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1f9a0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1f9b0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1f9c0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1f9d0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
1f9e0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
1f9f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1fa00 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1fa10 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1fa20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
1fa30 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1fa40 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
1fa50 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
1fa60 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
1fa70 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
1fa80 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
1fa90 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
1faa0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
1fab0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1fac0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1fad0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
1fae0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1faf0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
1fb00 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1fb10 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1fb20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1fb30 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1fb40 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
1fb50 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
1fb60 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1fb70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1fb80 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
1fb90 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1fba0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1fbd0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
1fbe0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
1fbf0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
1fc00 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1fc10 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
1fc20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1fc30 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
1fc40 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
1fc50 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
1fc60 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
1fc70 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1fc80 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1fc90 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1fca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fcb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
1fcc0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
1fcd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1fce0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
1fcf0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
1fd00 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
1fd10 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
1fd20 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
1fd30 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
1fd40 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
1fd50 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
1fd60 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1fd70 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
1fd80 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
1fd90 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
1fda0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1fdb0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1fdc0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1fdd0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
1fde0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
1fdf0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
1fe00 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
1fe10 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1fe20 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
1fe30 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
1fe40 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
1fe50 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
1fe60 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
1fe70 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
1fe80 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
1fe90 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
1fea0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
1feb0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
1fec0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
1fed0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
1fee0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1fef0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
1ff00 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
1ff10 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
1ff20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
1ff30 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
1ff40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ff50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1ff60 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1ff70 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1ff80 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1ff90 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1ffa0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1ffb0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1ffc0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1ffd0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1ffe0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
1fff0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
20000 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
20010 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
20020 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
20030 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20040 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
20050 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
20060 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
20070 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
20080 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
20090 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
200a0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
200b0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
200c0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
200d0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
200e0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
200f0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
20100 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
20110 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
20120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
20130 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
20140 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
20150 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
20160 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
20170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
20180 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
20190 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
201a0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
201b0 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
201c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
201d0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
201e0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
201f0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
20200 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
20210 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
20220 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
20230 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
20240 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
20250 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
20260 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
20270 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
20280 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20290 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
202a0 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
202b0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
202c0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
202d0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
202e0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
202f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
20300 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
20310 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
20320 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
20330 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
20340 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
20350 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
20360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
20370 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
20380 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
20390 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
203a0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
203b0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
203c0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
203d0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
203e0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
203f0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
20400 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
20410 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
20420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
20430 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
20440 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20450 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
20460 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
20470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e  0 ){.        mun
20480 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
20490 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
204a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
204b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
204c0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
204d0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
204e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
204f0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
20500 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
20510 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
20520 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
20530 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
20540 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
20550 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
20560 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
20570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20580 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
20590 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
205a0 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
205b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
205c0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
205d0 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
205e0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
205f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
20600 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
20610 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
20620 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
20630 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
20640 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
20650 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
20660 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
20670 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
20680 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
20690 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
206a0 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
206b0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
206c0 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
206d0 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
206e0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
206f0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
20700 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
20710 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
20720 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
20730 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
20740 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
20750 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
20760 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
20770 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
20780 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
20790 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
207a0 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
207b0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
207c0 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
207d0 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
207e0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
207f0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
20800 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20810 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
20820 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
20830 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
20840 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
20850 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
20860 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
20870 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
20880 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
20890 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
208a0 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
208b0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
208c0 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
208d0 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
208e0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
208f0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
20900 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
20910 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20920 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
20930 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
20940 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
20950 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
20960 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
20970 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
20980 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
20990 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
209a0 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
209b0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
209c0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
209d0 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
209e0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
209f0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
20a00 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
20a10 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
20a20 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
20a30 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
20a40 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
20a50 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
20a60 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
20a70 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
20a80 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
20a90 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
20aa0 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
20ab0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
20ac0 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
20ad0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
20ae0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
20af0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
20b00 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
20b10 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
20b20 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
20b30 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
20b40 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
20b50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
20b60 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
20b70 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
20b80 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
20b90 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
20ba0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
20bb0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
20bc0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
20bd0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
20be0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
20bf0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
20c00 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
20c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
20c20 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
20c30 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
20c40 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
20c50 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
20c60 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
20c70 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
20c80 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
20c90 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20ca0 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
20cb0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
20cc0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
20cd0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
20ce0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
20cf0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
20d00 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
20d10 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
20d20 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
20d30 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
20d40 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
20d50 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
20d60 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
20d70 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
20d80 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
20d90 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
20da0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
20db0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
20dc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
20dd0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
20de0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
20df0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
20e00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20e10 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
20e20 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
20e30 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
20e60 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
20e70 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
20e80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
20e90 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
20ea0 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
20eb0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
20ec0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20ed0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
20ee0 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
20ef0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
20f00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20f10 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
20f20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
20f30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20f40 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
20f50 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
20f60 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
20f70 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
20f80 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
20f90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20fa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
20fb0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
20fc0 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
20fd0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
20fe0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
20ff0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
21000 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
21010 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
21020 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
21030 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
21040 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
21050 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
21060 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
21070 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
21080 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
21090 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
210a0 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
210b0 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
210c0 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
210d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
210e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210f0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
21100 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
21110 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
21120 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
21130 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
21140 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
21150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21160 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
21170 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
21180 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
21190 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
211a0 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
211b0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
211c0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
211d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
211e0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
211f0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
21200 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
21210 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21220 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
21230 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
21240 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
21250 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
21260 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
21270 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
21280 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
21290 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
212a0 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
212b0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
212c0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
212d0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
212e0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
212f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
21300 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
21310 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
21320 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
21330 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
21340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21350 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
21360 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
21370 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
21380 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
21390 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
213a0 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
213b0 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
213c0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
213d0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
213e0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
213f0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
21400 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
21410 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21420 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
21430 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21460 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
21470 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
214a0 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
214b0 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
214c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
214d0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
214e0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
214f0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
21500 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
21510 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
21520 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
21530 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
21540 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
21550 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
21560 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
21570 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
21590 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
215a0 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
215b0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
215c0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
215d0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
215e0 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
215f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
21600 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21610 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21620 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
21630 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
21640 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
21650 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
21660 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
21670 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
21680 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
21690 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
216a0 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
216b0 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
216c0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
216d0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
216e0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
216f0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
21700 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
21710 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21720 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
21730 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
21740 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
21750 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
21760 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
21770 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
21780 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
21790 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
217a0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
217b0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
217c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
217d0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
217e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
217f0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
21800 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
21810 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
21820 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
21830 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
21840 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
21850 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
21860 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
21870 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
21880 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
21890 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
218a0 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
218b0 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
218c0 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
218d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
218e0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
218f0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
21900 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
21910 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
21920 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
21930 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
21940 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
21950 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
21960 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
21970 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
21980 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
21990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
219a0 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
219b0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
219c0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
219d0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
219e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
219f0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
21a00 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
21a10 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
21a20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
21a30 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21a40 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
21a50 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
21a60 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
21a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21aa0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21ab0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
21ac0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
21ad0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
21ae0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
21af0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
21b00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21b10 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
21b20 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
21b30 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
21b40 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
21b50 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21b60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21b70 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
21b80 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
21b90 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
21ba0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
21bb0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
21bc0 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
21bd0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
21be0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
21bf0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
21c00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
21c10 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
21c20 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
21c30 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
21c40 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
21c50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
21c60 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
21c70 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
21c80 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
21c90 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
21ca0 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
21cb0 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
21cc0 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
21cd0 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
21ce0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
21cf0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
21d00 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
21d10 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
21d20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
21d30 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
21d40 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
21d50 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
21d60 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21d70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21d80 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
21d90 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
21da0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
21db0 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
21dc0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
21dd0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21df0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
21e00 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
21e10 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
21e20 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
21e30 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
21e40 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
21e50 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
21e60 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
21e70 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
21e80 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21ea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21eb0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
21ec0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
21ed0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
21ee0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
21ef0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
21f00 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21f20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
21f30 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
21f40 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
21f50 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
21f60 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
21f70 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
21f80 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
21f90 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
21fa0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21fb0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
21fc0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
21fd0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
21fe0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
21ff0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
22000 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
22010 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
22020 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
22030 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
22040 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
22050 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
22060 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
22070 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
22080 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
22090 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
220a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
220b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
220c0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
220d0 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
220e0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
220f0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
22100 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
22110 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
22120 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
22130 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
22140 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
22150 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
22160 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
22170 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
22180 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
22190 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
221a0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
221b0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
221c0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
221d0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
221e0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
221f0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
22200 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
22210 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22220 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
22230 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
22240 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
22250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22260 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
22270 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
22280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
22290 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
222a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
222b0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
222e0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
222f0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
22300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22310 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
22320 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
22350 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
22360 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
22370 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
22380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22390 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
223a0 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
223b0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
223c0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
223d0 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
223e0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
223f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22400 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22410 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
22420 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
22430 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
22440 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
22450 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
22460 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
22470 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
22480 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
22490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
224a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
224b0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
224c0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
224d0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
224e0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
224f0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
22500 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
22510 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
22520 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
22530 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
22540 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
22550 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
22560 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
22570 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
22580 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
22590 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
225a0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
225b0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
225c0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
225d0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
225e0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
225f0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
22600 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
22610 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
22620 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
22650 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
22660 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
22670 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
22680 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
22690 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
226a0 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
226b0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
226c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
226d0 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
226e0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
226f0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
22700 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
22710 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
22720 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
22730 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
22740 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
22750 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22760 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
22770 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
22780 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
22790 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
227a0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
227b0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
227c0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
227d0 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
227e0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
227f0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
22800 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
22810 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
22820 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
22830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22840 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
22850 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22860 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
22870 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
22880 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
22890 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
228a0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
228b0 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
228c0 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
228d0 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
228e0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
228f0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
22900 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
22910 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
22920 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
22930 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22940 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
22950 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
22960 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61  rue, use ftrunca
22970 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
22980 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
22990 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
229a0 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20   region..       
229b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
229c0 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20  !bExtend ) goto 
229d0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23 69 66  shmpage_out;.#if
229e0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
229f0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
22a00 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
22a10 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20 20 69  LOCATE.        i
22a20 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70  f( osFallocate(p
22a30 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
22a40 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79 74 65  t.st_size, nByte
22a50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22a60 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
22a70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22a80 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c 6c 6f  _SHMSIZE, "fallo
22a90 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20  cate",.         
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
22ac0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
22ad0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
22ae0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  out;.        }.#
22af0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
22b00 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
22b10 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
22b20 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
22b30 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22b40 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22b50 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
22b60 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
22b90 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
22ba0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22bb0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
22bc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
22bd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
22be0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
22bf0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
22c00 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22c10 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
22c20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
22c30 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
22c40 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
22c50 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
22c60 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
22c70 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
22c80 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
22c90 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
22ca0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22cb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
22cc0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
22cd0 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
22ce0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
22cf0 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
22d00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22d10 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
22d20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
22d30 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
22d40 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
22d50 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30     pMem = mmap(0
22d60 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20  , szRegion,.    
22d70 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
22d80 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
22d90 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
22da0 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
22db0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
22dc0 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
22dd0 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
22de0 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
22df0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
22e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
22e10 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
22e20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22e30 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
22e40 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
22e50 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
22e60 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
22e70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22e80 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
22e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
22ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
22eb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
22ec0 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  c(szRegion);.   
22ed0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
22ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22ef0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22f00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22f10 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
22f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
22f30 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
22f40 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
22f50 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
22f60 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
22f70 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20  ode->nRegion] = 
22f80 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMem;.      pShm
22f90 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
22fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
22fb0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
22fc0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
22fd0 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
22fe0 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  *pp = pShmNode->
22ff0 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  apRegion[iRegion
23000 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
23010 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
23020 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
23030 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
23040 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
23050 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
23060 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23070 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
23080 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
23090 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
230a0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
230b0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
230c0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
230d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
230e0 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
230f0 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
23100 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
23110 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
23120 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
23130 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
23140 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
23150 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
23160 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
23170 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
23180 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
23190 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
231a0 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
231b0 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
231c0 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
231d0 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
231e0 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
231f0 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
23200 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
23210 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
23220 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
23230 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
23240 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
23250 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
23260 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
23270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23280 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
23290 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
232a0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
232c0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
232d0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
232e0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
232f0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
23300 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
23310 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
23320 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
23330 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
23340 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
23350 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
23360 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
23370 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
23380 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
23390 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
233a0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
233b0 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
233c0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
233d0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233f0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
23400 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
23410 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
23420 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
23430 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
23440 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
23450 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
23460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
23490 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
234c0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
234d0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
234e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
234f0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
23500 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
23510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23520 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
23530 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
23540 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
23550 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
23560 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
23570 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
23580 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
23590 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
235a0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
235b0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
235c0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
235d0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
235e0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
235f0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
23600 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
23610 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
23620 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
23630 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
23640 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
23650 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
23660 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
23670 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
23680 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
23690 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
236a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
236b0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
236c0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
236d0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
236e0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
236f0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
23700 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23710 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
23720 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
23730 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
23740 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
23750 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
23760 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
23770 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23780 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23790 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
237a0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
237b0 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
237c0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
237d0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
237e0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
237f0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
23800 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
23810 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
23820 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
23830 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
23840 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
23850 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
23860 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23870 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
23880 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
23890 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
238a0 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
238b0 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
238c0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
238d0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
238e0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
238f0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
23900 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
23910 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
23920 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
23930 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
23940 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
23950 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
23960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23980 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
23990 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
239a0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
239b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
239c0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
239d0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
239e0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
239f0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23a00 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
23a10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
23a20 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
23a30 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
23a40 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
23a50 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
23a60 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
23a70 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
23a80 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
23a90 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
23aa0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
23ab0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
23ac0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
23ad0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
23ae0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
23af0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
23b00 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
23b10 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
23b20 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
23b30 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
23b40 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
23b50 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
23b60 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
23b70 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
23b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
23b90 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
23ba0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
23bc0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
23bd0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
23be0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
23bf0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
23c00 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
23c10 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
23c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
23c40 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
23c50 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
23c60 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23c70 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
23c80 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
23c90 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
23ca0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23cc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
23cd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
23ce0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
23cf0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
23d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23d10 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
23d20 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
23d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
23d40 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
23d50 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
23d60 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
23d70 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
23d80 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
23d90 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
23da0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
23db0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
23dc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
23dd0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
23de0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
23df0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
23e00 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
23e10 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
23e20 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
23e30 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
23e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23e50 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
23e60 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23e70 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
23e80 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
23e90 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
23ea0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
23eb0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
23ec0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
23ed0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
23ee0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
23ef0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
23f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f10 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23f20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
23f30 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
23f40 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
23f50 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
23f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23f80 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
23f90 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
23fa0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
23fb0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
23fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23fd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
23fe0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
23ff0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
24000 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
24010 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
24020 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
24030 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
24040 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
24050 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
24060 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
24070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24080 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
24090 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
240a0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
240b0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
240c0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
240d0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
240e0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
240f0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
24100 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
24110 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
24120 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
24130 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
24140 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
24150 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
24160 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
24170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24180 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
24190 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
241a0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
241b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
241c0 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
241d0 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
241e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
241f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
24200 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
24210 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
24220 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
24230 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
24240 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
24250 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
24260 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
24270 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
24280 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
24290 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
242a0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
242b0 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
242c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
242d0 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
242e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24300 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24320 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
24330 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
24340 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
24350 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
24360 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
24370 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
24380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24390 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
243a0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
243b0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
243c0 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
243d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
243e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
243f0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
24400 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
24410 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24420 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
24430 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
24440 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
24450 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
24460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
24470 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
24480 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
24490 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
244a0 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
244b0 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
244c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
244d0 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
244e0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
244f0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24500 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24510 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
24520 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24530 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
24540 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
24550 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
24560 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
24570 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
24580 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
24590 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
245a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
245b0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
245c0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
245d0 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
245e0 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
245f0 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
24600 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
24610 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
24620 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
24630 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
24640 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
24650 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
24660 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24670 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
24680 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
24690 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
246a0 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
246b0 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
246c0 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
246d0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
246e0 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
246f0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
24700 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
24710 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
24720 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
24730 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24740 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
24750 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
24760 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f  hmNode->h>=0 ) o
24770 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65  sUnlink(pShmNode
24780 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
24790 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
247a0 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
247b0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
247c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
247d0 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
247e0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
247f0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
24800 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
24810 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
24820 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
24830 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
24840 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
24850 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24860 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
24870 2a 20 41 72 67 75 6d 65 6e 74 73 20 78 20 61 6e  * Arguments x an
24880 64 20 79 20 61 72 65 20 62 6f 74 68 20 69 6e 74  d y are both int
24890 65 67 65 72 73 2e 20 41 72 67 75 6d 65 6e 74 20  egers. Argument 
248a0 79 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  y must be a powe
248b0 72 20 6f 66 20 32 2e 0a 2a 2a 20 52 6f 75 6e 64  r of 2..** Round
248c0 20 78 20 75 70 20 74 6f 20 74 68 65 20 6e 65 61   x up to the nea
248d0 72 65 73 74 20 69 6e 74 65 67 65 72 20 6d 75 6c  rest integer mul
248e0 74 69 70 6c 65 20 6f 66 20 79 2e 20 46 6f 72 20  tiple of y. For 
248f0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
24900 20 20 20 52 4f 55 4e 44 55 50 28 30 2c 20 20 38     ROUNDUP(0,  8
24910 29 20 2d 3e 20 20 30 0a 2a 2a 20 20 20 20 20 52  ) ->  0.**     R
24920 4f 55 4e 44 55 50 28 31 33 2c 20 38 29 20 2d 3e  OUNDUP(13, 8) ->
24930 20 31 36 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44   16.**     ROUND
24940 55 50 28 33 32 2c 20 38 29 20 2d 3e 20 33 32 0a  UP(32, 8) -> 32.
24950 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e 44  */.#define ROUND
24960 55 50 28 78 2c 79 29 20 20 20 20 20 28 28 28 78  UP(x,y)     (((x
24970 29 2b 79 2d 31 29 26 7e 28 79 2d 31 29 29 0a 0a  )+y-1)&~(y-1))..
24980 2f 2a 0a 2a 2a 20 4d 61 70 2c 20 72 65 6d 61 70  /*.** Map, remap
24990 20 6f 72 20 75 6e 6d 61 70 20 70 61 72 74 20 6f   or unmap part o
249a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
249b0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
249c0 6e 74 20 75 6e 69 78 4d 72 65 6d 61 70 28 0a 20  nt unixMremap(. 
249d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
249e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
249f0 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73   /* Main databas
24a00 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
24a10 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
24a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
24a30 61 73 6b 20 6f 66 20 53 51 4c 49 54 45 5f 4d 52  ask of SQLITE_MR
24a40 45 4d 41 50 5f 58 58 58 20 66 6c 61 67 73 20 2a  EMAP_XXX flags *
24a50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
24a60 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
24a70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
24a80 20 73 74 61 72 74 20 6d 61 70 70 69 6e 67 20 61   start mapping a
24a90 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
24aa0 6e 74 36 34 20 6e 4f 6c 64 2c 20 20 20 20 20 20  nt64 nOld,      
24ab0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
24ac0 66 20 6f 6c 64 20 6d 61 70 70 69 6e 67 2c 20 6f  f old mapping, o
24ad0 72 20 7a 65 72 6f 20 2a 2f 0a 20 20 73 71 6c 69  r zero */.  sqli
24ae0 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77 2c 20  te3_int64 nNew, 
24af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24b00 69 7a 65 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ize of new mappi
24b10 6e 67 2c 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 20  ng, or zero */. 
24b20 20 76 6f 69 64 20 2a 2a 70 70 4d 61 70 20 20 20   void **ppMap   
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 6c 64 2f   /* IN/OUT: Old/
24b50 6e 65 77 20 6d 61 70 70 69 6e 67 73 20 2a 2f 0a  new mappings */.
24b60 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
24b70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
24b80 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
24b90 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
24ba0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
24bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
24bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24bd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 76 6f  urn code */.  vo
24be0 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  id *pNew = 0;   
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c00 20 4e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   New mapping */.
24c10 20 20 69 36 34 20 6e 4e 65 77 52 6e 64 3b 20 20    i64 nNewRnd;  
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 2f 2a 20 6e 4e 65 77 20 72 6f 75 6e 64 65    /* nNew rounde
24c40 64 20 75 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  d up */.  i64 nO
24c50 6c 64 52 6e 64 3b 20 20 20 20 20 20 20 20 20 20  ldRnd;          
24c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 6c            /* nOl
24c70 64 20 72 6f 75 6e 64 65 64 20 75 70 20 2a 2f 0a  d rounded up */.
24c80 0a 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3d  .  assert( iOff=
24c90 3d 30 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72  =0 );.  /* asser
24ca0 74 28 20 70 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d  t( p->mmapSize==
24cb0 6e 4f 6c 64 20 29 3b 20 2a 2f 0a 20 20 61 73 73  nOld ); */.  ass
24cc0 65 72 74 28 20 70 2d 3e 70 4d 61 70 52 65 67 69  ert( p->pMapRegi
24cd0 6f 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4d 61 70  on==0 || p->pMap
24ce0 52 65 67 69 6f 6e 3d 3d 28 2a 70 70 4d 61 70 29  Region==(*ppMap)
24cf0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
24d00 20 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45   SQLITE_MREMAP_E
24d10 58 54 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  XTEND flag is se
24d20 74 2c 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  t, then the size
24d30 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
24d40 64 20 0a 20 20 2a 2a 20 6d 61 70 70 69 6e 67 20  d .  ** mapping 
24d50 28 6e 4e 65 77 20 62 79 74 65 73 29 20 6d 61 79  (nNew bytes) may
24d60 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
24d70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
24d90 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
24da0 74 68 65 20 63 61 73 65 2c 20 65 78 74 65 6e 64  the case, extend
24db0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
24dc0 6b 20 75 73 69 6e 67 20 66 74 72 75 6e 63 61 74  k using ftruncat
24dd0 65 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  e().  */.  asser
24de0 74 28 20 6e 4e 65 77 3e 30 20 7c 7c 20 28 66 6c  t( nNew>0 || (fl
24df0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4d 52 45  ags & SQLITE_MRE
24e00 4d 41 50 5f 45 58 54 45 4e 44 29 3d 3d 30 20 29  MAP_EXTEND)==0 )
24e10 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
24e20 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45 58  SQLITE_MREMAP_EX
24e30 54 45 4e 44 20 29 7b 0a 20 20 20 20 73 74 72 75  TEND ){.    stru
24e40 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
24e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
24e60 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
24e70 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72  rmation */.    r
24e80 63 20 3d 20 6f 73 46 73 74 61 74 28 70 2d 3e 68  c = osFstat(p->h
24e90 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
24ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24eb0 4f 4b 20 26 26 20 6e 4e 65 77 3e 73 74 61 74 62  OK && nNew>statb
24ec0 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 20 20  uf.st_size ){.  
24ed0 20 20 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f      rc = robust_
24ee0 66 74 72 75 6e 63 61 74 65 28 70 2d 3e 68 2c 20  ftruncate(p->h, 
24ef0 6e 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nNew);.    }.   
24f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24f10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24f20 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 63 6f 72 64    }..  /* Accord
24f30 69 6e 67 20 74 6f 20 73 6f 6d 65 20 73 6f 75 72  ing to some sour
24f40 63 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 20  ces, the effect 
24f50 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  of changing the 
24f60 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  size of the.  **
24f70 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
24f80 20 6f 6e 20 6d 61 70 70 65 64 20 72 65 67 69 6f   on mapped regio
24f90 6e 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ns that correspo
24fa0 6e 64 20 74 6f 20 74 68 65 20 61 64 64 65 64 20  nd to the added 
24fb0 6f 72 0a 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20  or.  ** removed 
24fc0 70 61 67 65 73 20 69 73 20 75 6e 64 65 66 69 6e  pages is undefin
24fd0 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
24fe0 72 65 20 69 73 20 72 65 61 73 6f 6e 20 74 6f 20  re is reason to 
24ff0 62 65 6c 69 65 76 65 20 74 68 61 74 0a 20 20 2a  believe that.  *
25000 2a 20 6f 6e 20 6d 6f 64 65 72 6e 20 70 6c 61 74  * on modern plat
25010 66 6f 72 6d 73 20 6c 69 6b 65 20 4c 69 6e 75 78  forms like Linux
25020 20 6f 72 20 4f 53 58 2c 20 74 68 69 6e 67 73 20   or OSX, things 
25030 6a 75 73 74 20 77 6f 72 6b 2e 20 46 6f 72 20 65  just work. For e
25040 78 61 6d 70 6c 65 2c 0a 20 20 2a 2a 20 69 74 20  xample,.  ** it 
25050 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  is possible to c
25060 72 65 61 74 65 20 61 20 6d 61 70 70 69 6e 67 20  reate a mapping 
25070 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
25080 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  file on disk and
25090 0a 20 20 2a 2a 20 65 78 74 65 6e 64 20 74 68 65  .  ** extend the
250a0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 6c 61   file on disk la
250b0 74 65 72 20 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  ter on..  **.  *
250c0 2a 20 45 78 70 6c 6f 69 74 20 74 68 69 73 20 6f  * Exploit this o
250d0 6e 20 4c 69 6e 75 78 20 61 6e 64 20 4f 53 58 20  n Linux and OSX 
250e0 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 6e 75  to reduce the nu
250f0 6d 62 65 72 20 6f 66 20 6d 75 6e 6d 61 70 28 29  mber of munmap()
25100 2f 6d 6d 61 70 28 29 20 0a 20 20 2a 2a 20 63 61  /mmap() .  ** ca
25110 6c 6c 73 20 72 65 71 75 69 72 65 64 20 69 66 20  lls required if 
25120 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
25130 20 63 68 61 6e 67 69 6e 67 2e 20 49 6e 20 74 68   changing. In th
25140 69 73 20 63 61 73 65 20 61 6c 6c 20 6d 61 70 70  is case all mapp
25150 69 6e 67 73 20 0a 20 20 2a 2a 20 61 72 65 20 72  ings .  ** are r
25160 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
25170 20 6e 65 61 72 65 73 74 20 34 4d 42 2e 20 41 6e   nearest 4MB. An
25180 64 20 69 66 20 61 20 6e 65 77 20 6d 61 70 70 69  d if a new mappi
25190 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64 20  ng is requested 
251a0 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 74  .  ** that has t
251b0 68 65 20 73 61 6d 65 20 72 6f 75 6e 64 65 64 20  he same rounded 
251c0 73 69 7a 65 20 61 73 20 61 6e 20 6f 6c 64 20 6d  size as an old m
251d0 61 70 70 69 6e 67 2c 20 74 68 65 20 6f 6c 64 20  apping, the old 
251e0 6d 61 70 70 69 6e 67 20 63 61 6e 20 0a 20 20 2a  mapping can .  *
251f0 2a 20 62 65 20 72 65 75 73 65 64 20 61 73 20 69  * be reused as i
25200 73 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s. */.#if define
25210 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
25220 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
25230 5f 29 0a 20 20 6e 4e 65 77 52 6e 64 20 3d 20 52  _).  nNewRnd = R
25240 4f 55 4e 44 55 50 28 6e 4e 65 77 2c 20 34 30 39  OUNDUP(nNew, 409
25250 36 2a 31 30 32 34 29 3b 0a 20 20 6e 4f 6c 64 52  6*1024);.  nOldR
25260 6e 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e 4f 6c  nd = ROUNDUP(nOl
25270 64 2c 20 34 30 39 36 2a 31 30 32 34 29 3b 0a 23  d, 4096*1024);.#
25280 65 6c 73 65 0a 20 20 6e 4e 65 77 52 6e 64 20 3d  else.  nNewRnd =
25290 20 52 4f 55 4e 44 55 50 28 6e 4e 65 77 2c 20 34   ROUNDUP(nNew, 4
252a0 30 39 36 2a 31 29 3b 0a 20 20 6e 4f 6c 64 52 6e  096*1);.  nOldRn
252b0 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e 4f 6c 64  d = ROUNDUP(nOld
252c0 2c 20 34 30 39 36 2a 31 29 3b 0a 23 65 6e 64 69  , 4096*1);.#endi
252d0 66 0a 0a 20 20 2f 2a 20 4f 6e 20 4f 53 58 20 6f  f..  /* On OSX o
252e0 72 20 4c 69 6e 75 78 2c 20 72 65 75 73 65 20 74  r Linux, reuse t
252f0 68 65 20 6f 6c 64 20 6d 61 70 70 69 6e 67 20 69  he old mapping i
25300 66 20 69 74 20 69 73 20 74 68 65 20 72 69 67 68  f it is the righ
25310 74 20 73 69 7a 65 2e 20 2a 2f 0a 23 69 66 20 64  t size. */.#if d
25320 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25330 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6c  ) || defined(__l
25340 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20 6e 4e  inux__).  if( nN
25350 65 77 52 6e 64 3d 3d 6e 4f 6c 64 52 6e 64 20 29  ewRnd==nOldRnd )
25360 7b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  {.    VVA_ONLY( 
25370 70 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4e  p->mmapSize = nN
25380 65 77 3b 20 29 0a 20 20 20 20 72 65 74 75 72 6e  ew; ).    return
25390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
253a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
253b0 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
253c0 20 75 6e 6d 61 70 20 61 6e 79 20 6f 6c 64 20 6d   unmap any old m
253d0 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
253e0 20 6e 4f 6c 64 52 6e 64 21 3d 30 20 29 7b 0a 20   nOldRnd!=0 ){. 
253f0 20 20 20 76 6f 69 64 20 2a 70 4f 6c 64 20 3d 20     void *pOld = 
25400 2a 70 70 4d 61 70 3b 0a 20 20 20 20 6d 75 6e 6d  *ppMap;.    munm
25410 61 70 28 70 4f 6c 64 2c 20 6e 4f 6c 64 52 6e 64  ap(pOld, nOldRnd
25420 29 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  );.    VVA_ONLY(
25430 20 70 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30   p->mmapSize = 0
25440 3b 20 70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ; p->pMapRegion 
25450 3d 20 30 3b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  = 0; );.  }..  /
25460 2a 20 41 6e 64 2c 20 69 66 20 72 65 71 75 69 72  * And, if requir
25470 65 64 2c 20 75 73 65 20 6d 6d 61 70 28 29 20 74  ed, use mmap() t
25480 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6d  o create a new m
25490 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
254a0 20 6e 4e 65 77 52 6e 64 3e 30 20 29 7b 0a 20 20   nNewRnd>0 ){.  
254b0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
254c0 4f 54 5f 52 45 41 44 3b 0a 20 20 20 20 69 66 28  OT_READ;.    if(
254d0 20 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26   (p->ctrlFlags &
254e0 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
254f0 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20  )==0 ) flags |= 
25500 50 52 4f 54 5f 57 52 49 54 45 3b 0a 20 20 20 20  PROT_WRITE;.    
25510 70 4e 65 77 20 3d 20 6d 6d 61 70 28 30 2c 20 6e  pNew = mmap(0, n
25520 4e 65 77 52 6e 64 2c 20 66 6c 61 67 73 2c 20 4d  NewRnd, flags, M
25530 41 50 5f 53 48 41 52 45 44 2c 20 70 2d 3e 68 2c  AP_SHARED, p->h,
25540 20 69 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20   iOff);.    if( 
25550 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
25560 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
25570 20 30 3b 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   0;.      VVA_ON
25580 4c 59 28 20 70 2d 3e 6d 6d 61 70 53 69 7a 65 20  LY( p->mmapSize 
25590 3d 20 30 3b 20 70 2d 3e 70 4d 61 70 52 65 67 69  = 0; p->pMapRegi
255a0 6f 6e 20 3d 20 30 3b 20 29 0a 20 20 20 20 20 20  on = 0; ).      
255b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
255c0 52 5f 4d 52 45 4d 41 50 3b 0a 20 20 20 20 7d 65  R_MREMAP;.    }e
255d0 6c 73 65 7b 0a 20 20 20 20 20 20 56 56 41 5f 4f  lse{.      VVA_O
255e0 4e 4c 59 28 20 70 2d 3e 6d 6d 61 70 53 69 7a 65  NLY( p->mmapSize
255f0 20 3d 20 6e 4e 65 77 3b 20 70 2d 3e 70 4d 61 70   = nNew; p->pMap
25600 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 20 29  Region = pNew; )
25610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
25620 70 4d 61 70 20 3d 20 70 4e 65 77 3b 0a 20 20 72  pMap = pNew;.  r
25630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25640 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
25650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
25660 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
25670 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
25680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25690 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
256a0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
256b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
256d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
25720 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
25730 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
25740 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
25750 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
25760 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
25770 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
25780 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
25790 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
257a0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
257b0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
257c0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
257d0 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
257e0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
257f0 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
25800 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
25810 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
25820 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
25830 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
25840 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
25850 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
25860 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
25870 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
25880 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
25890 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
258a0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
258b0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
258c0 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
258d0 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
258e0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
258f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
25900 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
25910 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
25920 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
25930 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
25940 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
25950 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
25960 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
25970 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
25980 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
25990 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
259a0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
259b0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
259c0 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
259d0 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
259e0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
259f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
25a00 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
25a10 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
25a20 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
25a30 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
25a40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
25a50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
25a60 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
25a70 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
25a80 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
25a90 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
25aa0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
25ab0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
25ac0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
25ad0 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
25ae0 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
25af0 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
25b00 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
25b10 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
25b20 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
25b30 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
25b40 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
25b50 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
25b60 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
25b70 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
25b80 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
25b90 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
25ba0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
25bb0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
25bc0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
25bd0 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
25be0 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
25bf0 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
25c00 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
25c10 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
25c20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
25c30 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
25c40 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
25c50 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
25c60 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
25c70 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
25c80 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
25c90 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
25ca0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
25cb0 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
25cc0 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45  , VERSION, CLOSE
25cd0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
25ce0 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73  CKLOCK)      \.s
25cf0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
25d00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
25d10 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
25d40 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d60 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25d90 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
25da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25db0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
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 20 20 20 5c 0a 20 20 20 75            \.   u
25de0 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
25df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
25e00 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
25e30 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
25e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
25e50 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
25e80 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
25e90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
25ea0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
25ed0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
25ee0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
25ef0 20 2a 2f 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 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
25f20 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
25f30 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
25f40 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
25f90 2f 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 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fd0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
25fe0 2a 2f 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 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26020 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
26030 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
26060 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
26070 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
26080 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
260b0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
260c0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
260d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
26100 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
26110 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
26120 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26140 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20  .   unixShmMap, 
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
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 20 20 20 5c 0a                \.
26190 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261b0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
261e0 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
261f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26200 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
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 20 20 20 5c 0a 20 20              \.  
26230 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20   unixShmUnmap,  
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26250 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
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 20 20 20 5c 0a 20 20 20             \.   
26280 75 6e 69 78 4d 72 65 6d 61 70 2c 20 20 20 20 20  unixMremap,     
26290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
262a0 4d 72 65 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  Mremap */       
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 20 20 20 5c 0a 7d 3b 20 20            \.};  
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
26320 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
26330 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
26340 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
26350 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
26360 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
26370 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
26380 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26390 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
263c0 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
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 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
26460 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
26470 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
26480 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
26490 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
264a0 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
264b0 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
264c0 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
264d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
264e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
264f0 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
26500 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
26510 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
26520 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
26530 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
26540 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
26550 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
26560 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
26570 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
26580 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
26590 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
265a0 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
265b0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
265c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
265d0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
265e0 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20  */.  3,         
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26600 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
26610 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61  and mmap are ena
26620 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
26630 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
26640 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
26650 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
26660 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
26670 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
26680 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
26690 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
266a0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
266b0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
266c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
266d0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
266e0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
266f0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
26700 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
26710 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
26720 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
26730 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
26740 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
26750 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
26760 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
26770 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
267a0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
267b0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  d */.  nolockClo
267c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
267d0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
267e0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
267f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
26800 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
26810 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
26820 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
26830 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
26840 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
26850 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
26860 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
26870 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
26880 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
26890 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
268a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
268b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
268c0 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
268d0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
268e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
268f0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
26900 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
26930 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
26940 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
26950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26960 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
26970 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26990 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
269a0 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
269b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
269c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
269d0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
269e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a  ReservedLock  /*
269f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
26a00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
26a10 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
26a20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
26a30 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
26a40 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
26a50 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
26a60 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
26a70 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
26a80 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
26a90 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
26aa0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
26ab0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
26ac0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ae0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
26af0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
26b00 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
26b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
26b20 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
26b30 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
26b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
26b50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
26b60 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
26b80 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
26b90 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
26ba0 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
26bb0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26bc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
26bd0 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
26be0 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
26bf0 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
26c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26c10 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
26c20 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
26c30 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
26c40 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
26c50 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
26c60 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
26c90 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
26ca0 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cc0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
26cd0 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cf0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
26d00 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d20 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
26d30 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
26d40 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
26d50 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
26d60 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
26d70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
26d80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
26d90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
26da0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
26db0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
26dc0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
26dd0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
26de0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
26df0 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
26e20 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
26e30 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
26e60 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
26e70 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
26e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
26e90 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
26ea0 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
26eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
26ec0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
26ed0 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
26ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
26ef0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
26f00 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
26f10 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
26f20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
26f30 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
26f40 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
26f50 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
26f60 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
26f70 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
26f80 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
26f90 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
26fa0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
26fb0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
26fc0 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
26fd0 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
26fe0 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
26ff0 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
27000 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
27010 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
27020 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
27030 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
27040 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
27050 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
27060 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
27070 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
27080 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
27090 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
270a0 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
270b0 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
270c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
270d0 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
270e0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
270f0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
27100 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
27110 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
27120 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
27130 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
27140 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
27150 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27160 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
27170 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
27180 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
27190 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
271a0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
271b0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
271c0 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
271d0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
271e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
271f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
27200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
27210 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
27220 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
27230 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
27240 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
27250 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
27260 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
27270 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
27280 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27290 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
272c0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
272d0 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
272e0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
272f0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
27300 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
27310 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
27320 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
27330 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
27340 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
27350 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
27360 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
27370 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
27380 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
27390 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
273a0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
273b0 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
273c0 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
273d0 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
273e0 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
273f0 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
27400 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
27410 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
27420 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
27430 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
27440 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
27450 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
27460 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
27470 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
27480 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
27490 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
274a0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
274b0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
274e0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
274f0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
27520 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
27550 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
27580 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
27590 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
275a0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
275b0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
275c0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
275d0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
275e0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
275f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27600 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
27610 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
27620 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
27630 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
27640 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
27650 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
27660 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
27670 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
27680 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
27690 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
276a0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
276b0 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
276c0 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
276d0 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
276e0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
276f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
27700 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
27710 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
27720 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
27730 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
27740 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
27750 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
27760 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
27770 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
27780 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
27790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
277a0 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
277b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
277c0 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
277d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
277e0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
277f0 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
27800 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
27810 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
27820 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
27830 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
27840 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
27850 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
27860 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
27870 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
27880 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
27890 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
278a0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
278b0 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
278c0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
278d0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
278e0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
278f0 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
27900 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
27910 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
27920 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
27930 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
27940 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
27950 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
27960 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
27970 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
27980 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
27990 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
279a0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
279b0 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
279c0 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
279d0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
279e0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
279f0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
27a00 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
27a10 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
27a20 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
27a30 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
27a40 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
27a50 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
27a60 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
27a70 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
27a80 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
27a90 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
27aa0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
27ab0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
27ac0 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
27ad0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
27ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
27af0 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
27b00 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
27b10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
27b20 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
27b30 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
27b40 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
27b50 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
27b60 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
27b70 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
27b80 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
27b90 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
27ba0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
27bb0 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
27bc0 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
27bd0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
27be0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
27bf0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
27c00 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
27c10 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
27c20 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
27c30 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
27c40 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
27c50 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
27c60 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
27c70 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
27c80 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
27c90 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
27ca0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
27cb0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
27cc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
27cd0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
27ce0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
27cf0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
27d00 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
27d10 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
27d20 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
27d30 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
27d40 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
27d50 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
27d60 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
27d70 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
27d80 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
27d90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27da0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
27db0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27dc0 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
27dd0 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
27de0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
27df0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
27e00 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
27e10 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
27e20 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
27e30 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
27e40 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
27e50 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
27e60 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
27e70 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
27e80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
27e90 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
27ea0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
27eb0 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
27ec0 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72  his is for VXWor
27ed0 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ks only..*/.stat
27ee0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
27ef0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
27f00 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
27f10 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
27f20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
27f30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
27f40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
27f50 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
27f60 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
27f70 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
27f80 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
27f90 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
27fa0 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
27fb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
27fc0 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
27fd0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
27fe0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
27ff0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
28000 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
28010 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
28020 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
28030 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
28040 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
28050 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
28060 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
28070 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
28080 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
28090 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
280a0 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
280b0 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
280c0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
280d0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
280e0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
280f0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
28100 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
28110 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
28120 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
28130 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
28140 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
28150 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
28160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
28170 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
28180 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
28190 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
281a0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
281b0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
281c0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
281d0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
281e0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
281f0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
28200 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
28210 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
28220 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
28230 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28240 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
28250 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
28260 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
28270 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64  r to a IO method
28280 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
28290 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
282a0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
282b0 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
282c0 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
282d0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
282e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
282f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
28330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
28350 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
28360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
28380 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
28390 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
283a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
283b0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
283c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
283d0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
283e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
283f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
28400 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
28410 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
28420 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
28430 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
28440 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
28450 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
28460 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
28470 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
284a0 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
284b0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
284c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
284d0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
284e0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
284f0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
28500 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
28510 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
28520 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
28530 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
28540 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
28550 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
28560 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
28570 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
28580 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
28590 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
285a0 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
285b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
285c0 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
285d0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
285e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
285f0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
28600 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
28610 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
28620 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
28630 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
28640 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
28650 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
28660 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
28670 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
28680 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
28690 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
286a0 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
286b0 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
286c0 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
286d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
286e0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
286f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28700 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
28710 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
28720 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
28730 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
28740 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
28750 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
28760 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
28770 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
28780 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
28790 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
287a0 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
287b0 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
287c0 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
287d0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
287e0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
287f0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
28800 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
28810 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
28820 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
28830 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
28840 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
28850 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
28860 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
28870 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
28880 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
28890 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 20  (u8)ctrlFlags;. 
288a0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 4e 65 77 2d   VVA_ONLY( pNew-
288b0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 20 29  >mmapSize = 0; )
288c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
288d0 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72  ri_boolean(((ctr
288e0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
288f0 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61  E_URI) ? zFilena
28900 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20  me : 0),.       
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49      "psow", SQLI
28930 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
28940 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
28950 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
28960 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b  = UNIXFILE_PSOW;
28970 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d  .  }.  if( strcm
28980 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75  p(pVfs->zName,"u
28990 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b  nix-excl")==0 ){
289a0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
289b0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
289c0 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20  _EXCL;.  }..#if 
289d0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
289e0 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
289f0 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
28a00 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
28a10 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
28a20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
28a30 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
28a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28a50 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
28a60 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67  ..  if( ctrlFlag
28a70 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
28a80 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  OCK ){.    pLock
28a90 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
28aa0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
28ab0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
28ac0 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
28ad0 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
28ae0 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
28af0 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66  name, pNew);.#if
28b00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28b10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
28b20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
28b30 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
28b40 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
28b50 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
28b60 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
28b70 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
28b80 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
28b90 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
28ba0 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
28bb0 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
28bc0 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
28bd0 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
28be0 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
28bf0 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
28c00 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
28c10 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
28c20 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
28c30 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
28c40 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
28c50 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69  Methods.#if defi
28c60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
28c70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
28c80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
28c90 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79    || pLockingSty
28ca0 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68  le == &nfsIoMeth
28cb0 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ods.#endif.  ){.
28cc0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
28cd0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
28ce0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
28cf0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
28d00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
28d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28d20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
28d30 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64   occured in find
28d40 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
28d50 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
28d60 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
28d70 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
28d80 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
28d90 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
28da0 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
28db0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
28dc0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
28dd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
28de0 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
28df0 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
28e00 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
28e10 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
28e20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
28e30 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
28e40 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
28e50 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
28e60 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
28e70 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
28e80 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
28e90 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
28ea0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
28eb0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
28ec0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
28ed0 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
28ee0 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
28ef0 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
28f00 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
28f10 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
28f20 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
28f30 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
28f40 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
28f50 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
28f60 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
28f70 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
28f80 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
28f90 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
28fa0 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
28fb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
28fc0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
28fd0 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
28fe0 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
28ff0 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
29000 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
29010 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
29020 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
29030 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
29040 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
29050 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
29060 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
29070 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
29080 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
29090 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
290a0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
290b0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
290c0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
290d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
290e0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
290f0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
29100 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29110 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
29120 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
29130 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
29140 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
29150 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
29160 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
29170 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
29180 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
29190 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
291a0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
291b0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
291c0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
291d0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
291e0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
291f0 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
29200 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
29210 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
29220 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
29230 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29240 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
29250 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
29260 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
29270 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
29280 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
29290 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
292a0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
292b0 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
292c0 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
292d0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
292e0 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
292f0 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
29300 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
29310 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
29320 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
29330 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
29340 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
29350 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
29360 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
29370 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
29380 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
29390 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
293a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
293b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
293c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
293d0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
293e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
293f0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
29400 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
29410 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
29420 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
29430 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
29440 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
29450 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
29460 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
29470 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
29480 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
29490 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
294a0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
294b0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
294c0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
294d0 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
294e0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
294f0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
29500 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
29510 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
29520 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
29530 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
29540 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
29550 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
29560 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
29570 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
29580 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
29590 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
295a0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
295b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
295c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
295d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
295e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
295f0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
29600 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
29610 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
29620 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
29630 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
29640 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
29650 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
29660 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
29670 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
29680 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
29690 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
296a0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
296b0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
296c0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
296d0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
296e0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
296f0 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
29700 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
29710 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
29720 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
29730 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
29740 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
29750 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
29760 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
29770 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
29780 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
29790 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
297a0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
297b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
297c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
297d0 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
297e0 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
297f0 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
29820 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
29830 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
29840 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
29850 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
29860 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
29870 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
29880 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
29890 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
298a0 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
298b0 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
298c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
298d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
298e0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
298f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29900 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
29910 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
29920 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
29930 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
29940 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
29950 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
29960 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
29970 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
29980 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
29990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
299a0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
299b0 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
299c0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
299d0 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
299e0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
299f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
29a00 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
29a10 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
29a20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
29a30 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
29a40 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  TE;.#endif.  if(
29a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29a60 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
29a70 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
29a80 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
29a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29aa0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
29ab0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
29ac0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
29ad0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29ae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
29af0 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
29b00 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
29b10 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
29b20 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
29b30 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
29b40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
29b50 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
29b60 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
29b70 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
29b80 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
29b90 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
29ba0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
29bb0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
29bc0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
29bd0 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
29be0 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
29bf0 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
29c00 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
29c10 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
29c20 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
29c30 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
29c40 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
29c50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
29c60 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
29c70 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
29c80 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
29c90 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
29ca0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
29cb0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
29cc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
29cd0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
29ce0 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
29cf0 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
29d00 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
29d10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29d20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
29d30 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
29d40 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
29d50 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
29d60 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
29d70 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
29d80 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
29d90 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
29da0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
29db0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
29dc0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
29dd0 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
29de0 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
29df0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
29e00 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
29e10 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
29e20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
29e30 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
29e40 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
29e50 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
29e60 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
29e70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
29e80 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
29e90 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
29ea0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
29eb0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
29ec0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
29ed0 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
29ee0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
29ef0 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
29f00 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
29f10 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
29f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
29f30 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
29f40 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
29f50 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
29f60 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
29f70 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
29f80 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
29f90 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
29fa0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
29fb0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
29fc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
29fd0 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
29fe0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
29ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a000 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2a010 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2a020 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2a030 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2a040 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2a050 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2a060 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2a070 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2a080 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2a090 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2a0a0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a0b0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2a0c0 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2a0d0 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2a0e0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2a0f0 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65  ) + 18) >= (size
2a100 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2a110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2a120 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2a130 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2a140 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
2a150 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2a160 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2a170 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2a180 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2a190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2a1a0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2a1b0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2a1c0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2a1d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2a1e0 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2a1f0 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2a200 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2a210 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2a220 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2a230 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  uf[j] = 0;.    z
2a240 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
2a250 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2a260 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2a270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a280 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2a290 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a2a0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2a2b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2a2c0 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2a2d0 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2a2e0 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2a2f0 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2a300 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2a310 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2a320 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2a330 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2a340 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2a350 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2a360 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2a370 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a380 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2a390 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2a3a0 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2a3b0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2a3c0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2a3d0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2a3e0 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2a3f0 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2a400 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2a410 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2a420 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2a430 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2a440 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2a450 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2a460 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2a470 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2a480 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a490 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2a4a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2a4b0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2a4c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2a4d0 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2a4e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a4f0 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2a500 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2a510 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2a520 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2a530 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2a540 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2a550 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2a560 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2a570 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2a580 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2a590 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2a5a0 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2a5b0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2a5c0 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2a5d0 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2a5e0 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2a5f0 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2a600 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2a610 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2a620 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2a630 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2a640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2a650 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2a660 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2a670 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2a680 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2a690 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2a6a0 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2a6b0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2a6c0 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2a6d0 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2a6e0 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2a6f0 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2a700 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2a710 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2a720 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2a730 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2a740 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2a750 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2a760 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2a770 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2a780 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2a790 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2a7a0 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2a7b0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2a7c0 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2a7d0 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2a7e0 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2a7f0 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2a800 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2a810 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2a820 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2a830 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2a840 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2a850 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2a860 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2a870 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2a880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a890 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2a8a0 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2a8b0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2a8c0 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2a8d0 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2a8e0 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2a8f0 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2a900 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2a910 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2a920 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2a930 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2a940 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2a950 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2a960 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2a970 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2a980 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2a990 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2a9a0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2a9b0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2a9c0 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2a9d0 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2a9e0 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2a9f0 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2aa00 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2aa10 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2aa20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2aa30 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2aa40 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2aa50 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2aa60 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2aa70 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2aa80 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
2aa90 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
2aaa0 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
2aab0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
2aac0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2aad0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
2aae0 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
2aaf0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2ab00 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
2ab10 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
2ab20 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
2ab30 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
2ab40 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
2ab70 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
2ab80 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
2ab90 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
2aba0 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
2abb0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
2abc0 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
2abd0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
2abe0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
2abf0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
2ac00 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
2ac10 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
2ac20 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
2ac30 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
2ac40 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
2ac50 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
2ac60 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
2ac70 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2ac80 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2ac90 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2aca0 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
2acb0 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
2acc0 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
2acd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2ace0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2acf0 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
2ad00 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
2ad10 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
2ad20 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
2ad30 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
2ad40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2ad50 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
2ad60 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
2ad70 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
2ad80 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
2ad90 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
2ada0 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
2adb0 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
2adc0 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
2add0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2ade0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2adf0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
2ae00 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2ae10 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
2ae20 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
2ae30 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  ** In most cases
2ae40 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
2ae50 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
2ae60 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
2ae70 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
2ae80 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
2ae90 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
2aea0 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
2aeb0 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
2aec0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2aed0 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
2aee0 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
2aef0 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
2af00 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
2af10 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
2af20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
2af30 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
2af40 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
2af50 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2af60 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
2af70 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
2af80 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2af90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
2afa0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
2afb0 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
2afc0 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
2afd0 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
2afe0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
2aff0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2b000 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2b010 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
2b020 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2b030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
2b040 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2b050 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
2b060 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
2b070 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
2b080 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
2b090 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
2b0a0 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
2b0b0 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
2b0c0 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
2b0d0 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
2b0e0 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
2b0f0 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
2b100 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
2b110 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
2b120 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
2b130 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2b140 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b160 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
2b170 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
2b180 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
2b190 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2b1b0 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
2b1c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
2b1d0 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
2b1e0 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
2b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2b200 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
2b210 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
2b220 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
2b230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b240 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
2b250 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
2b260 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
2b270 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2b290 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
2b2a0 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
2b2b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b2c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2b2d0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2b2e0 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
2b2f0 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
2b300 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
2b310 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2b320 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2b330 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2b340 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
2b350 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
2b360 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
2b370 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
2b380 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b3b0 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
2b3c0 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  Db */.    struct
2b3d0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2b3e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2b3f0 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
2b400 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2b410 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
2b420 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
2b430 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
2b440 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2b450 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
2b460 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
2b470 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2b480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2b490 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
2b4a0 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
2b4b0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
2b4c0 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
2b4d0 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
2b4e0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2b4f0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
2b500 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2b510 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
2b520 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2b530 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a  journalNN".    *
2b540 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2b550 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a  >-walNN".    **.
2b560 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20      ** where NN 
2b570 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d  is a decimal num
2b580 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69  ber. The NN nami
2b590 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
2b5a0 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2b5b0 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
2b5c0 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
2b5d0 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
2b5e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2b5f0 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66  th) - 1; .#ifdef
2b600 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2b610 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69  _3_NAMES.    whi
2b620 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c  le( nDb>0 && sql
2b630 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74  ite3Isalnum(zPat
2b640 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b  h[nDb]) ) nDb--;
2b650 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20  .    if( nDb==0 
2b660 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  || zPath[nDb]!='
2b670 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  -' ) return SQLI
2b680 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20  TE_OK;.#else.   
2b690 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
2b6a0 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  b]!='-' ){.     
2b6b0 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29   assert( nDb>0 )
2b6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b6d0 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27  zPath[nDb]!='\n'
2b6e0 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b   );.      nDb--;
2b6f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2b700 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2b710 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2b720 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2b730 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
2b740 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
2b750 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
2b760 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2b770 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70  & 0777;.      *p
2b780 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2b790 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20  id;.      *pGid 
2b7a0 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2b7b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b7c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2b7d0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
2b7e0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2b7f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2b800 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2b810 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2b820 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
2b830 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
2b840 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
2b850 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
2b860 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
2b870 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
2b880 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
2b890 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
2b8a0 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
2b8b0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2b8c0 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
2b8d0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2b8e0 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
2b8f0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2b900 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
2b910 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
2b920 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2b930 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
2b940 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
2b950 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
2b960 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
2b970 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2b980 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
2b990 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
2b9a0 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
2b9b0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2b9c0 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
2b9d0 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
2b9e0 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
2b9f0 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
2ba00 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
2ba10 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
2ba20 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
2ba30 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
2ba40 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
2ba50 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
2ba60 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
2ba70 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
2ba80 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
2ba90 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
2baa0 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
2bab0 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
2bac0 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
2bad0 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
2bae0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
2baf0 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
2bb00 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2bb10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bb20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
2bb30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bb50 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
2bb60 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
2bb70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2bb80 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2bb90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2bba0 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
2bbb0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
2bbc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2bbd0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
2bbe0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2bbf0 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
2bc00 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
2bc10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2bc20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
2bc30 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
2bc40 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
2bc50 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc70 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
2bc80 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
2bc90 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
2bca0 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
2bcb0 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2bcc0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bce0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2bcf0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
2bd00 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
2bd10 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2bd20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2bd30 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2bd40 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
2bd50 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
2bd60 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2bd70 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2bd80 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2bdb0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
2bdc0 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
2bdd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2bde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2bdf0 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
2be00 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
2be10 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2be20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
2be30 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
2be40 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2be50 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2be60 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2be70 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2be80 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2be90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2bea0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2beb0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2bec0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2bed0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2bee0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2bef0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2bf00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2bf10 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
2bf20 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
2bf30 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2bf40 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
2bf50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2bf60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2bf70 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
2bf80 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2bf90 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2bfa0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
2bfb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2bfc0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2bfd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2bfe0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2bff0 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
2c000 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2c010 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2c020 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2c030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2c040 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2c050 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2c060 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2c070 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2c080 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2c090 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2c0a0 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2c0b0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2c0c0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2c0d0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2c0e0 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
2c0f0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
2c100 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
2c110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2c120 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2c130 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2c140 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2c150 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2c160 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2c170 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
2c180 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
2c190 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
2c1a0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2c1b0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
2c1c0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
2c1d0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
2c1e0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
2c1f0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
2c200 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
2c210 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
2c220 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
2c230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2c240 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
2c250 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
2c260 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
2c270 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
2c280 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
2c290 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
2c2a0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
2c2b0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
2c2c0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
2c2d0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
2c2e0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
2c2f0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
2c300 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
2c310 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
2c320 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
2c330 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2c340 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2c350 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
2c360 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
2c370 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2c380 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2c390 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
2c3a0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
2c3b0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
2c3c0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
2c3d0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
2c3e0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
2c3f0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
2c400 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
2c410 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2c420 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
2c430 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
2c440 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
2c450 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
2c460 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
2c470 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
2c480 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
2c490 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
2c4a0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2c4b0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
2c4c0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
2c4d0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
2c4e0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2c4f0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2c500 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2c510 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
2c520 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2c530 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2c540 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2c550 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2c560 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2c570 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2c580 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2c590 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2c5a0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2c5b0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2c5c0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2c5d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
2c5e0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
2c5f0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
2c600 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
2c610 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
2c620 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
2c630 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2c640 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2c650 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
2c660 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2c670 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
2c680 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2c690 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2c6a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2c6b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2c6c0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2c6d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2c6e0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
2c6f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2c700 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2c710 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2c720 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2c730 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
2c740 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2c750 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
2c760 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
2c770 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
2c780 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
2c790 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2c7a0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
2c7b0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
2c7c0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
2c7d0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
2c7e0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
2c7f0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2c800 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
2c810 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
2c820 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
2c830 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2c840 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
2c850 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
2c860 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
2c870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c880 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2c890 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
2c8a0 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a  sed = pUnused;..
2c8b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2c8c0 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f  filenames are do
2c8d0 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
2c8e0 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65  ated if they are
2c8f0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73   not.    ** URIs
2c900 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
2c910 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
2c920 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
2c930 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  sed into.    ** 
2c940 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
2c950 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20  meter(). */.    
2c960 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
2c970 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
2c980 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ) || zName[strle
2c990 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
2c9a0 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  ;..  }else if( !
2c9b0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  zName ){.    /* 
2c9c0 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c  If zName is NULL
2c9d0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2c9e0 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20  r is requesting 
2c9f0 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a  a temp file. */.
2ca00 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
2ca10 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29  ete && !syncDir)
2ca20 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47  ;.    rc = unixG
2ca30 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
2ca40 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e  ATHNAME+2, zTmpn
2ca50 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
2ca60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ca70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ca80 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
2ca90 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20  = zTmpname;..   
2caa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65   /* Generated te
2cab0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
2cac0 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75  s are always dou
2cad0 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
2cae0 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75  ted.    ** for u
2caf0 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72  se by sqlite3_ur
2cb00 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
2cb10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e  /.    assert( zN
2cb20 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
2cb30 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  )+1]==0 );.  }..
2cb40 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
2cb50 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2cb60 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
2cb70 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
2cb80 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
2cb90 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
2cba0 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
2cbb0 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
2cbc0 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
2cbd0 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
2cbe0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
2cbf0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
2cc00 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
2cc10 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
2cc20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
2cc30 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
2cc40 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
2cc50 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
2cc60 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
2cc70 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
2cc80 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
2cc90 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
2cca0 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
2ccb0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
2ccc0 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
2ccd0 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
2cce0 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
2ccf0 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
2cd00 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
2cd10 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
2cd20 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
2cd30 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
2cd40 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2cd50 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
2cd60 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
2cd70 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f  with */.    uid_
2cd80 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  t uid;          
2cd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2cda0 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rid for the file
2cdb0 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69   */.    gid_t gi
2cdc0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2cdd0 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64        /* Groupid
2cde0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
2cdf0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72  .    rc = findCr
2ce00 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61  eateFileMode(zNa
2ce10 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e  me, flags, &open
2ce20 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64  Mode, &uid, &gid
2ce30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ce40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ce50 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55    assert( !p->pU
2ce60 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61  nused );.      a
2ce70 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2ce80 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c  LITE_OPEN_WAL ||
2ce90 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2cea0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2ceb0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2cec0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
2ced0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2cee0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
2cef0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
2cf00 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
2cf10 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
2cf20 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
2cf30 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  enFlags));.    i
2cf40 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
2cf50 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
2cf60 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
2cf70 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
2cf80 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
2cf90 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
2cfa0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2cfb0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
2cfc0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
2cfd0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
2cfe0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2cff0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2d000 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2d010 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
2d020 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
2d030 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2d040 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2d050 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2d060 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  _RDONLY;.      i
2d070 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
2d080 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
2d090 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
2d0a0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
2d0b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d0c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72   fd<0 ){.      r
2d0d0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2d0e0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2d0f0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
2d100 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
2d110 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2d120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2d130 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
2d140 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
2d150 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e  t and if creatin
2d160 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b  g a new rollback
2d170 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2d180 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74  or WAL file, set
2d190 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f   the ownership o
2d1a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  f the journal or
2d1b0 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a   WAL to be.    *
2d1c0 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
2d1d0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
2d1e0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2d1f0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
2d200 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2d210 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2d220 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  URNAL) ){.      
2d230 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64  osFchown(fd, uid
2d240 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  , gid);.    }.  
2d250 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
2d260 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
2d270 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
2d280 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
2d290 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
2d2a0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
2d2b0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
2d2c0 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
2d2d0 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2d2e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
2d2f0 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
2d300 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
2d310 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
2d320 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61      osUnlink(zNa
2d330 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
2d340 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2d350 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2d360 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
2d370 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
2d380 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
2d390 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ..  noLock = eTy
2d3a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2d3b0 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66  MAIN_DB;..  .#if
2d3c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2d3d0 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
2d3e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d3f0 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73  LE.  if( fstatfs
2d400 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  (fd, &fsInfo) ==
2d410 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   -1 ){.    ((uni
2d420 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c  xFile*)pFile)->l
2d430 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2d440 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
2d450 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2d460 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  __);.    return 
2d470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
2d480 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
2d490 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
2d4a0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
2d4b0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
2d4c0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
2d4d0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
2d4e0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
2d4f0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
2d500 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
2d510 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20   up appropriate 
2d520 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ctrlFlags */.  i
2d530 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20  f( isDelete )   
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2d550 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2d560 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28  LE_DELETE;.  if(
2d570 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20   isReadonly )   
2d580 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2d590 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2d5a0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e  _RDONLY;.  if( n
2d5b0 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20  oLock )         
2d5c0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2d5d0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
2d5e0 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e  OLOCK;.  if( syn
2d5f0 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20  cDir )          
2d600 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2d610 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
2d620 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67  SYNC;.  if( flag
2d630 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2d640 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20  URI ) ctrlFlags 
2d650 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b  |= UNIXFILE_URI;
2d660 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2d670 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d680 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
2d690 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2d6a0 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
2d6b0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
2d6c0 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
2d6d0 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
2d6e0 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
2d6f0 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
2d700 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
2d710 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2d720 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2d730 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
2d740 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
2d750 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
2d760 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2d770 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
2d780 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
2d790 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
2d7a0 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
2d7b0 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
2d7c0 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
2d7d0 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
2d7e0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
2d7f0 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
2d800 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2d810 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
2d820 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
2d830 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28       if( statfs(
2d840 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  zPath, &fsInfo) 
2d850 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  == -1 ){.       
2d860 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
2d870 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c  he close(fd) cal
2d880 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c  l is sub-optimal
2d890 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  . If the file op
2d8a0 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ened.        ** 
2d8b0 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74  with fd is a dat
2d8c0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20  abase file, and 
2d8d0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
2d8e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e  connections open
2d8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
2d900 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
2d910 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64  e currently hold
2d920 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ing advisory loc
2d930 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20  ks on it,.      
2d940 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61    ** then the ca
2d950 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69  ll to close() wi
2d960 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20  ll cancel those 
2d970 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69  locks. In practi
2d980 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ce,.        ** w
2d990 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68  e're assuming th
2d9a0 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73  at statfs() does
2d9b0 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66  n't fail very of
2d9c0 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20  ten. At least.  
2d9d0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69        ** not whi
2d9e0 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  le other file de
2d9f0 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
2da00 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
2da10 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20  cess on.        
2da20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ** the same file
2da30 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a   are working.  *
2da40 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73  /.        p->las
2da50 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2da60 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2da70 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2da80 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72  NE__);.        r
2da90 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2daa0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
2dab0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
2dac0 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
2dad0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
2dae0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
2daf0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
2db00 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
2db10 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2db20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
2db30 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
2db40 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
2db50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2db60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2db70 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
2db80 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2db90 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
2dba0 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
2dbb0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2dbc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dbd0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
2dbe0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
2dbf0 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
2dc00 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
2dc10 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
2dc20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
2dc30 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
2dc40 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
2dc50 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
2dc60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
2dc70 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
2dc80 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
2dc90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
2dca0 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
2dcb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2dcc0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
2dcd0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
2dce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2dcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2dd00 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2dd10 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
2dd20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
2dd30 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2dd40 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
2dd50 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
2dd60 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
2dd70 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
2dd80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dd90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2dda0 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
2ddb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2ddc0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2ddd0 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
2dde0 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
2ddf0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
2de00 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
2de10 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2de20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
2de30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2de40 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
2de50 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2de60 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
2de70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2de80 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
2de90 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2dea0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2deb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2dec0 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
2ded0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
2dee0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2def0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
2df00 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
2df10 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
2df20 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2df30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2df40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2df50 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
2df60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
2df70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2df80 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
2df90 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
2dfa0 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
2dfb0 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
2dfc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2dfd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2dfe0 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65  TE_NOENT;.    }e
2dff0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e000 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2e010 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2e020 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74  , "unlink", zPat
2e030 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  h);.    }.    re
2e040 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66  turn rc;.  }.#if
2e050 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2e060 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
2e070 28 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21  ( (dirSync & 1)!
2e080 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  =0 ){.    int fd
2e090 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
2e0a0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
2e0b0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
2e0c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e0d0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2e0e0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
2e0f0 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
2e100 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
2e110 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
2e120 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
2e130 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2e140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
2e150 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
2e160 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
2e170 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2e180 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
2e190 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  __);.    }else i
2e1a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
2e1b0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
2e1c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e1d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2e1e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e1f0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
2e200 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
2e210 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
2e220 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
2e230 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
2e240 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
2e250 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
2e260 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
2e270 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2e280 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
2e290 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
2e2a0 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
2e2b0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
2e2c0 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
2e2d0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
2e2e0 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
2e2f0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
2e300 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
2e310 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2e320 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
2e330 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
2e340 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
2e350 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
2e360 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
2e370 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
2e380 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
2e390 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
2e3a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2e3b0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e3c0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
2e3d0 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
2e3e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
2e3f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2e400 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
2e410 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
2e420 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
2e430 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
2e440 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
2e450 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
2e460 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
2e470 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
2e480 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
2e490 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2e4a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2e4b0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2e4c0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
2e4d0 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
2e4e0 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
2e4f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2e500 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
2e510 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
2e520 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2e530 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2e540 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
2e550 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
2e560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e570 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2e580 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
2e590 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
2e5a0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2e5b0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
2e5c0 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
2e5d0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
2e5e0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
2e5f0 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61   = (osAccess(zPa
2e600 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a  th, amode)==0);.
2e610 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c    if( flags==SQL
2e620 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2e630 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b  S && *pResOut ){
2e640 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
2e650 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d   buf;.    if( 0=
2e660 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
2e670 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73  buf) && buf.st_s
2e680 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
2e690 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
2e6a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2e6c0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
2e6d0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
2e6e0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
2e6f0 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
2e700 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
2e710 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
2e720 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
2e730 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
2e740 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
2e750 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
2e760 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
2e770 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
2e780 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
2e790 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
2e7a0 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
2e7b0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
2e7c0 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
2e7d0 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
2e7e0 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
2e7f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2e800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e810 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
2e820 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2e830 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2e840 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e850 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2e860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2e870 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
2e880 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
2e890 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
2e8a0 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
2e8d0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
2e8e0 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
2e8f0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
2e900 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2e910 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20  buffer */.){..  
2e920 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2e930 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2e940 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2e950 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2e960 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2e970 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2e980 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2e990 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2e9a0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2e9b0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2e9c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
2e9d0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
2e9e0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
2e9f0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
2ea00 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
2ea10 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
2ea20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2ea30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2ea40 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2ea50 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
2ea60 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
2ea70 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
2ea80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ea90 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e  pVfs);..  zOut[n
2eaa0 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out-1] = '\0';. 
2eab0 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
2eac0 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
2ead0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c  3_snprintf(nOut,
2eae0 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61   zOut, "%s", zPa
2eaf0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
2eb00 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
2eb10 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
2eb20 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
2eb30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
2eb40 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2eb50 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2eb60 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
2eb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
2eb80 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
2eb90 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2eba0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
2ebb0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
2ebc0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
2ebd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ebe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
2ebf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ec00 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
2ec10 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
2ec20 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
2ec30 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
2ec40 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
2ec50 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
2ec60 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2ec70 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
2ec80 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2ec90 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
2eca0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
2ecb0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
2ecc0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
2ecd0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
2ece0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
2ecf0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ed00 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2ed10 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
2ed20 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
2ed30 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
2ed40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
2ed50 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
2ed60 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
2ed70 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2ed80 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
2ed90 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
2eda0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
2edb0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
2edc0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
2edd0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
2ede0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
2edf0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
2ee00 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
2ee10 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
2ee20 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
2ee30 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
2ee40 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
2ee50 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
2ee60 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
2ee70 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
2ee80 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
2ee90 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2eea0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2eeb0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2eec0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2eed0 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
2eee0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2eef0 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
2ef00 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
2ef10 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
2ef20 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
2ef30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2ef40 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
2ef50 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
2ef60 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2ef70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2ef80 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
2ef90 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2efa0 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
2efb0 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
2efc0 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
2efd0 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
2efe0 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
2eff0 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
2f000 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
2f010 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
2f020 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2f030 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
2f040 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
2f050 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
2f060 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
2f070 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
2f080 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
2f090 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2f0a0 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
2f0b0 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
2f0c0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
2f0d0 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
2f0e0 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
2f0f0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
2f100 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
2f110 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
2f120 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
2f130 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
2f140 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
2f150 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
2f160 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
2f170 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
2f180 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
2f190 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
2f1a0 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
2f1b0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
2f1c0 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
2f1d0 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
2f1e0 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
2f1f0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
2f200 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
2f210 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
2f220 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
2f230 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
2f240 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
2f250 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
2f260 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
2f270 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
2f280 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
2f290 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
2f2a0 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
2f2b0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
2f2c0 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
2f2d0 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
2f2e0 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
2f2f0 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
2f300 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
2f310 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
2f320 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
2f330 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2f340 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
2f350 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2f360 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
2f370 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
2f380 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
2f390 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
2f3a0 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
2f3b0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
2f3c0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
2f3d0 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2f3e0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
2f3f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2f400 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
2f410 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
2f420 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
2f430 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2f440 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
2f450 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
2f460 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
2f470 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
2f480 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
2f490 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
2f4a0 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
2f4b0 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
2f4c0 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
2f4d0 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
2f4e0 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
2f4f0 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
2f500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2f510 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
2f520 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2f530 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2f540 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
2f550 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2f560 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
2f570 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
2f580 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
2f590 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
2f5a0 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
2f5b0 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
2f5c0 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
2f5d0 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
2f5e0 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
2f5f0 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
2f600 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
2f610 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
2f620 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
2f630 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
2f640 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
2f650 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
2f660 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
2f670 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
2f680 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
2f690 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
2f6a0 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
2f6b0 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
2f6c0 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
2f6d0 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
2f6e0 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
2f6f0 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
2f700 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
2f710 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
2f720 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
2f730 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
2f740 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
2f750 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
2f760 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
2f770 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
2f780 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
2f790 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
2f7a0 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
2f7b0 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
2f7c0 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
2f7d0 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
2f7e0 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
2f7f0 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
2f800 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
2f810 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2f820 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
2f830 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2f840 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
2f850 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20  d, fd, got;.    
2f860 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2f870 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
2f880 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20   O_RDONLY, 0);. 
2f890 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2f8a0 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
2f8b0 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
2f8c0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
2f8d0 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
2f8e0 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
2f8f0 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
2f900 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
2f910 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
2f920 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
2f930 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
2f940 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
2f950 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
2f960 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
2f970 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
2f980 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
2f990 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d  .      do{ got =
2f9a0 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66   osRead(fd, zBuf
2f9b0 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28  , nBuf); }while(
2f9c0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
2f9d0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
2f9e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2f9f0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2fa00 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2fa10 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
2fa20 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
2fa30 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
2fa40 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
2fa50 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
2fa60 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
2fa70 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
2fa80 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2fa90 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
2faa0 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
2fab0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2fac0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
2fad0 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
2fae0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
2faf0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
2fb00 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
2fb10 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
2fb20 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
2fb30 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
2fb40 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2fb50 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
2fb60 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
2fb70 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
2fb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2fb90 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
2fba0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2fbb0 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
2fbc0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2fbd0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2fbe0 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
2fbf0 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
2fc00 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
2fc10 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
2fc20 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
2fc30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
2fc40 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
2fc50 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
2fc60 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2fc70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2fc80 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
2fc90 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
2fca0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
2fcb0 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
2fcc0 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
2fcd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2fce0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2fcf0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
2fd00 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
2fd10 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
2fd20 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
2fd30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
2fd40 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2fd50 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2fd60 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
2fd70 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
2fd80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
2fd90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2fda0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2fdb0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2fdc0 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2fdd0 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2fde0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2fdf0 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2fe00 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2fe10 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2fe20 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2fe30 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2fe40 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2fe50 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2fe60 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2fe70 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2fe80 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2fe90 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2fea0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2feb0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2fec0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2fed0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2fee0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2fef0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2ff00 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2ff10 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2ff20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2ff30 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2ff40 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2ff50 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2ff60 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2ff70 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2ff80 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2ff90 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2ffa0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2ffb0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2ffc0 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2ffd0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2ffe0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2fff0 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
30000 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
30010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30020 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
30030 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
30040 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
30050 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
30060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30070 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
30080 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
30090 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
300a0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
300b0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
300c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
300d0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
300e0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
300f0 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e  64)8640000;.  in
30100 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30110 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
30120 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
30130 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
30140 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
30150 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
30160 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
30170 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
30180 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
30190 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
301a0 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
301b0 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
301c0 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
301d0 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
301e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
301f0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
30200 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
30210 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
30220 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
30230 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79  if( gettimeofday
30240 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b  (&sNow, 0)==0 ){
30250 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  .    *piNow = un
30260 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
30270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
30280 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
30290 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20  .tv_usec/1000;. 
302a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
302b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
302c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
302d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
302e0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
302f0 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
30300 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
30310 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
30320 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
30330 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
30340 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
30350 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30360 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
30370 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  rc;.}../*.** Fin
30380 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
30390 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
303a0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
303b0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
303c0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
303d0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
303e0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
303f0 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
30400 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
30410 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
30420 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
30430 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
30440 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
30450 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
30460 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30470 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
30480 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
30490 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  i = 0;.  int rc;
304a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
304b0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
304c0 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74  rc = unixCurrent
304d0 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
304e0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
304f0 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
30500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30510 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47   We added the xG
30520 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65  etLastError() me
30530 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e  thod with the in
30540 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69  tention of provi
30550 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c  ding.** better l
30560 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d  ow-level error m
30570 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65  essages when ope
30580 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
30590 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
305a0 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
305b0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
305c0 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20  so far, none of 
305d0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d  that has been im
305e0 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20  plemented.** in 
305f0 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68  the core.  So th
30600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
30610 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72  ver called.  For
30620 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65   now, it is mere
30630 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f  ly.** a place-ho
30640 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lder..*/.static 
30650 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45  int unixGetLastE
30660 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
30670 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
30680 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e  otUsed2, char *N
30690 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53  otUsed3){.  UNUS
306a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
306b0 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Used);.  UNUSED_
306c0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
306d0 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2);.  UNUSED_PA
306e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33  RAMETER(NotUsed3
306f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
30700 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../*.**********
30710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
30720 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
30730 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
30740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30750 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
30760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307a0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
307b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
307f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
30800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30810 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
30820 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
30830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30840 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
30850 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
30860 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
30870 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
30880 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
30890 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
308a0 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
308b0 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
308c0 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
308d0 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
308e0 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
308f0 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
30900 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
30910 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
30920 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
30930 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
30940 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
30950 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
30960 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
30970 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
30980 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
30990 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
309a0 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
309b0 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
309c0 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
309d0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
309e0 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
309f0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
30a00 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
30a10 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
30a20 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
30a30 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
30a40 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
30a50 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
30a60 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
30a70 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
30a80 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
30a90 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
30aa0 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
30ab0 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
30ac0 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
30ad0 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
30ae0 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
30af0 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
30b00 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
30b10 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
30b20 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
30b30 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
30b40 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
30b50 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
30b60 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
30b70 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
30b80 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
30b90 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
30ba0 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
30bb0 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
30bc0 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
30bd0 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
30be0 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
30bf0 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
30c00 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
30c10 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
30c20 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
30c30 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
30c40 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
30c50 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
30c60 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
30c70 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
30c80 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
30c90 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
30ca0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
30cb0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
30cc0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
30cd0 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
30ce0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
30cf0 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
30d00 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
30d10 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
30d20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
30d30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  0.**      RESERV
30d40 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
30d50 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
30d60 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
30d70 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
30d80 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
30d90 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
30da0 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
30db0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
30dc0 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
30dd0 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
30de0 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
30df0 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
30e00 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
30e10 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
30e20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
30e30 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
30e40 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
30e50 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
30e60 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
30e70 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
30e80 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
30e90 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
30ea0 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
30eb0 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
30ec0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
30ed0 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
30ee0 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
30ef0 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
30f00 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
30f10 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
30f20 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
30f30 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
30f40 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
30f50 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
30f60 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
30f70 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
30f80 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
30f90 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
30fa0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
30fb0 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
30fc0 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
30fd0 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
30fe0 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
30ff0 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
31000 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
31010 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
31020 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
31030 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
31040 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
31050 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
31060 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
31070 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
31080 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
31090 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
310a0 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
310b0 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
310c0 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
310d0 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
310e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
310f0 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
31100 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
31110 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
31120 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
31130 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
31140 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
31150 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
31160 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
31170 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
31180 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
31190 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
311a0 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
311c0 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a  proxy_path> | ":
311d0 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c  auto:");.**  sql
311e0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
311f0 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
31200 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
31210 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f  XYFILE, &<proxy_
31220 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
31230 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
31240 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
31250 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
31260 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
31270 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
31280 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
31290 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
312a0 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
312b0 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
312c0 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
312d0 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
312e0 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
312f0 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
31300 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
31310 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
31320 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
31330 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
31340 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
31350 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
31360 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
31370 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
31380 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
31390 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
313a0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
313b0 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
313c0 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
313d0 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
313e0 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
313f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
31400 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
31410 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
31420 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
31430 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
31440 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
31450 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
31460 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
31470 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
31480 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
31490 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
314a0 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
314b0 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
314c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
314d0 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
314e0 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
314f0 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
31500 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
31510 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
31520 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
31530 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
31540 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
31550 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
31560 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
31570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
31580 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
31590 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
315a0 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
315b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
315c0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
315d0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
315e0 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
315f0 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
31600 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
31610 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
31620 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
31630 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
31640 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
31650 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
31660 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
31670 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
31680 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
31690 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
316a0 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
316b0 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
316c0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
316d0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
316e0 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
316f0 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
31700 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
31710 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
31720 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
31730 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
31740 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
31750 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
31760 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
31770 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
31780 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
31790 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
317a0 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
317b0 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
317c0 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
317d0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
317e0 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
317f0 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
31800 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
31810 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
31820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31830 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
31840 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
31850 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
31860 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
31870 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
31880 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
31890 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
318a0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
318b0 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73  or it's contents
318c0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
318d0 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64  e.** host ID and
318e0 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20  /or proxy path, 
318f0 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
31900 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e   escalated to an
31910 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f   exclusive.** lo
31920 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68  ck and the conch
31930 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69   file contents i
31940 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
31950 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70  he host ID and p
31960 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64  roxy.** path and
31970 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77   the lock is dow
31980 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61  ngraded to a sha
31990 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20  red lock again. 
319a0 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a   If the conch.**
319b0 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74   is held by anot
319c0 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74  her process (wit
319d0 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29  h a shared lock)
319e0 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  , the exclusive 
319f0 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  lock.** will fai
31a00 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  l and SQLITE_BUS
31a10 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
31a20 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
31a30 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62  ile - a single-b
31a40 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  yte file used fo
31a50 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66  r all advisory f
31a60 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72  ile locks.** nor
31a70 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74  mally taken on t
31a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31a90 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .   This allows 
31aa0 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67  for safe sharing
31ab0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
31ac0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c  ase file for mul
31ad0 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e  tiple readers an
31ae0 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65  d writers on the
31af0 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74   same.** host (t
31b00 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73  he conch ensures
31b10 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75   that they all u
31b20 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61  se the same loca
31b30 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a  l lock file)..**
31b40 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74  .** Requesting t
31b50 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f  he lock proxy do
31b60 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65  es not immediate
31b70 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63  ly take the conc
31b80 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79  h, it is.** only
31b90 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
31ba0 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f  first request to
31bb0 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66   lock database f
31bc0 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a  ile is made.  .*
31bd0 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  * This matches t
31be0 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
31bf0 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20  the traditional 
31c00 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
31c10 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69  , where.** openi
31c20 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ng a connection 
31c30 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
31c40 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65  le does not take
31c50 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a   a lock on it..*
31c60 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63  * The shared loc
31c70 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69  k and an open fi
31c80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
31c90 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74  e maintained unt
31ca0 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  il .** the conne
31cb0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
31cc0 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e  abase is closed.
31cd0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78   .**.** The prox
31ce0 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c  y file and the l
31cf0 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76  ock file are nev
31d00 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68  er deleted so th
31d10 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20  ey only need.** 
31d20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68  to be created th
31d30 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
31d40 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  y are used..**.*
31d50 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
31d60 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d  options.** -----
31d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d80 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50  .**.**  SQLITE_P
31d90 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
31da0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ING.**.**       
31db0 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  Database files a
31dc0 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c  ccessed on non-l
31dd0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
31de0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  s are.**       a
31df0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
31e00 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78  figured for prox
31e10 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20  y locking, lock 
31e20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20  files are.**    
31e30 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74     named automat
31e40 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65  ically using the
31e50 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
31e60 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  *       PRAGMA l
31e70 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22  ock_proxy_file="
31e80 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a  :auto:".**    .*
31e90 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  *  SQLITE_PROXY_
31ea0 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DEBUG.**.**     
31eb0 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f    Enables the lo
31ec0 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d  gging of error m
31ed0 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68  essages during h
31ee0 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20  ost id file.**  
31ef0 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61       retrieval a
31f00 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a  nd creation.**.*
31f10 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  *  LOCKPROXYDIR.
31f20 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
31f30 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
31f40 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64  t directory used
31f50 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20   for lock proxy 
31f60 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  files that.**   
31f70 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75      are named au
31f80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20  tomatically via 
31f90 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74  the ":auto:" set
31fa0 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ting.**.**  SQLI
31fb0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
31fc0 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
31fd0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d  **.**       Perm
31fe0 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77  issions to use w
31ff0 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64  hen creating a d
32000 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f  irectory for sto
32010 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ring the.**     
32020 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c    lock proxy fil
32030 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68  es, only used wh
32040 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20  en LOCKPROXYDIR 
32050 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20  is not set..**  
32060 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20    .**    .** As 
32070 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c  mentioned above,
32080 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77   when compiled w
32090 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45  ith SQLITE_PREFE
320a0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c  R_PROXY_LOCKING,
320b0 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20  .** setting the 
320c0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
320d0 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43  able SQLITE_FORC
320e0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  E_PROXY_LOCKING 
320f0 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72  to 1 will.** for
32100 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ce proxy locking
32110 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
32120 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66  every database f
32130 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20  ile opened, and 
32140 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20  0.** will force 
32150 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20  automatic proxy 
32160 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69  locking to be di
32170 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64  sabled for all d
32180 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
32190 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c   (explicity call
321a0 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53  ing the SQLITE_S
321b0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
321c0 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
321d0 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
321e0 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
321f0 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
32200 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
32210 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
32220 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
32230 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
32240 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
32250 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
32260 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
32270 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32280 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
32290 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
322a0 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
322b0 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
322c0 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
322d0 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
322e0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
322f0 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
32300 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
32310 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
32320 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
32330 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
32340 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
32350 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
32360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
32370 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
32380 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
32390 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
323a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
323b0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
323c0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
323d0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
323e0 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
323f0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
32400 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
32410 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
32420 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
32430 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
32440 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
32450 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
32460 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
32470 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
32480 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
32490 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
324a0 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
324b0 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
324c0 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
324d0 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
324e0 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
324f0 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
32500 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
32510 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
32520 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
32530 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
32540 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
32550 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
32560 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
32570 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
32580 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
32590 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
325a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
325b0 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
325c0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
325d0 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
325e0 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
325f0 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
32600 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
32610 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
32620 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
32630 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
32640 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
32650 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
32660 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
32670 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
32680 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
32690 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
326a0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
326b0 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
326c0 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
326d0 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
326e0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
326f0 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
32700 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
32710 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
32720 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
32730 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
32740 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
32750 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
32760 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
32770 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
32780 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28  , errno, getpid(
32790 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
327a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
327b0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
327c0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
327d0 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
327e0 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
327f0 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
32800 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
32810 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
32820 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
32830 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
32840 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
32850 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
32860 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
32870 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
32880 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
32890 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
328a0 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
328b0 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
328c0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
328d0 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
328e0 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
328f0 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
32900 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
32910 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
32920 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
32930 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
32940 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
32950 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
32960 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
32970 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
32980 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
32990 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
329a0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
329b0 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70  \n", lPath, getp
329c0 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
329d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
329e0 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
329f0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
32a00 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
32a10 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
32a20 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
32a30 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
32a40 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
32a50 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
32a60 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
32a70 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
32a80 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
32a90 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
32aa0 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
32ab0 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
32ac0 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
32ad0 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
32ae0 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
32af0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
32b00 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
32b10 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
32b20 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
32b30 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
32b40 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
32b50 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
32b60 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
32b70 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
32b80 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
32b90 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
32ba0 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
32bb0 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
32bc0 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
32bd0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
32be0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
32bf0 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
32c00 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
32c10 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
32c20 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
32c30 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
32c40 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
32c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d  .        if( osM
32c60 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
32c70 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
32c80 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
32c90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
32ca0 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
32cb0 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
32cc0 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
32cd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
32ce0 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
32cf0 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
32d00 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
32d10 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
32d20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
32d30 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
32d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d50 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
32d60 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
32d70 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
32d80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
32d90 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
32da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32db0 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
32dc0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
32dd0 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
32de0 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
32df0 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
32e00 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
32e10 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
32e20 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
32e30 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
32e40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
32e50 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
32e60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
32e70 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
32e80 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
32e90 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
32ea0 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
32eb0 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
32ec0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
32ed0 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
32ee0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
32ef0 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
32f00 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
32f10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
32f20 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
32f30 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
32f40 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
32f50 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
32f60 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
32f70 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
32f80 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
32f90 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
32fa0 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
32fb0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
32fc0 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
32fd0 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
32fe0 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
32ff0 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
33000 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
33010 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
33020 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
33030 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
33040 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
33050 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
33060 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
33070 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
33080 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
33090 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70  ITE_OK;.  int op
330a0 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
330b0 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71   | O_CREAT;.  sq
330c0 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56  lite3_vfs dummyV
330d0 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f  fs;.  int terrno
330e0 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73   = 0;.  UnixUnus
330f0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
33100 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66  NULL;..  /* 1. f
33110 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e  irst try to open
33120 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
33130 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74  .  ** 2. if that
33140 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73   fails, and this
33150 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   is a lock file 
33160 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79  (not-conch), try
33170 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
33180 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74  he parent direct
33190 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74  ories and then t
331a0 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33  ry again..  ** 3
331b0 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
331c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   try to open the
331d0 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   file read-only.
331e0 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72    ** otherwise r
331f0 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c  eturn BUSY (if l
33200 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e  ock file) or CAN
33210 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f  TOPEN for the co
33220 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20  nch file.  */.  
33230 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
33240 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f  usableFd(path, o
33250 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  penFlags);.  if(
33260 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
33270 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
33280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
33290 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
332a0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
332b0 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69  pUnused));.    i
332c0 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
332d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
332e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
332f0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
33300 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  {.    fd = robus
33310 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
33320 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
33330 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
33340 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
33350 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26  errno==ENOENT &&
33360 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
33370 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72       if( proxyCr
33380 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74  eateLockPath(pat
33390 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  h) == SQLITE_OK 
333a0 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  ){.        fd = 
333b0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
333c0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
333d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
333e0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
333f0 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d  .    openFlags =
33400 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66   O_RDONLY;.    f
33410 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
33420 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
33430 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20   0);.    terrno 
33440 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69  = errno;.  }.  i
33450 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69  f( fd<0 ){.    i
33460 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  f( islockfile ){
33470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33480 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
33490 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72  .    switch (ter
334a0 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73  rno) {.      cas
334b0 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20  e EACCES:.      
334c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
334d0 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65  PERM;.      case
334e0 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72   EIO: .        r
334f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
33500 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e  RR_LOCK; /* even
33510 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68   though it is th
33520 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20  e conch */.     
33530 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
33540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33550 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
33560 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e     }.  }.  .  pN
33570 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
33580 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
33590 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
335a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
335b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
335c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
335d0 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
335e0 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
335f0 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
33600 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
33610 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73   pNew->openFlags
33620 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
33630 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73  memset(&dummyVfs
33640 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
33650 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56  yVfs));.  dummyV
33660 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
33670 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
33680 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56  Finder;.  dummyV
33690 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d  fs.zName = "dumm
336a0 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  y";.  pUnused->f
336b0 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
336c0 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
336d0 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
336e0 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
336f0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
33700 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
33710 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65  Vfs, fd, (sqlite
33720 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
33730 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  th, 0);.  if( rc
33740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33750 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65     *ppFile = pNe
33760 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  w;.    return SQ
33770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64  LITE_OK;.  }.end
33780 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20  _create_proxy:  
33790 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73    .  robust_clos
337a0 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49  e(pNew, fd, __LI
337b0 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33  NE__);.  sqlite3
337c0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73  _free(pNew);.  s
337d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75  qlite3_free(pUnu
337e0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
337f0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
33800 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75  ITE_TEST./* simu
33810 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
33820 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
33830 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
33840 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20  le paths */.int 
33850 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
33860 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  um = 0;.#endif..
33870 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f  #define PROXY_HO
33880 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f  STIDLEN    16  /
33890 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73  * conch file hos
338a0 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a  t id length */..
338b0 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65  /* Not always de
338c0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61  fined in the hea
338d0 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74  ders as it ought
338e0 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e   to be */.extern
338f0 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64   int gethostuuid
33900 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73  (uuid_t id, cons
33910 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65  t struct timespe
33920 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65  c *wait);../* ge
33930 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
33940 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
33950 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
33960 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
33970 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
33980 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
33990 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
339a0 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
339b0 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
339c0 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
339d0 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  Error){.  assert
339e0 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  (PROXY_HOSTIDLEN
339f0 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f   == sizeof(uuid_
33a00 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48  t));.  memset(pH
33a10 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f  ostID, 0, PROXY_
33a20 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20  HOSTIDLEN);.#if 
33a30 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53  defined(__MAX_OS
33a40 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  _X_VERSION_MIN_R
33a50 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20  EQUIRED)\.      
33a60 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41           && __MA
33a70 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d  C_OS_X_VERSION_M
33a80 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30  IN_REQUIRED<1050
33a90 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  .  {.    static 
33aa0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d  const struct tim
33ab0 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20  espec timeout = 
33ac0 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63  {1, 0}; /* 1 sec
33ad0 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20   timeout */.    
33ae0 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28  if( gethostuuid(
33af0 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75  pHostID, &timeou
33b00 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
33b10 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
33b20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b     if( pError ){
33b30 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72  .        *pError
33b40 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a   = err;.      }.
33b50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33b60 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
33b70 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
33b80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 45  SED_PARAMETER(pE
33b90 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69  rror);.#endif.#i
33ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
33bb0 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  .  /* simulate m
33bc0 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
33bd0 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
33be0 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
33bf0 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  hs */.  if( sqli
33c00 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21  te3_hostid_num !
33c10 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49  = 0){.    pHostI
33c20 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48  D[0] = (char)(pH
33c30 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72  ostID[0] + (char
33c40 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )(sqlite3_hostid
33c50 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20  _num & 0xFF));. 
33c60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
33c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33c80 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68  .}../* The conch
33c90 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
33ca0 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20  he header, host 
33cb0 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  id and lock file
33cc0 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e   path. */.#defin
33cd0 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  e PROXY_CONCHVER
33ce0 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79  SION 2   /* 1-by
33cf0 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79  te header, 16-by
33d00 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68  te host id, path
33d10 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
33d20 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31  Y_HEADERLEN    1
33d30 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65     /* conch file
33d40 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a   header length *
33d50 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
33d60 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52  PATHINDEX    (PR
33d70 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
33d80 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23  OXY_HOSTIDLEN).#
33d90 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58  define PROXY_MAX
33da0 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59  CONCHLEN  (PROXY
33db0 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
33dc0 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41  _HOSTIDLEN+MAXPA
33dd0 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54  THLEN)../* .** T
33de0 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e  akes an open con
33df0 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20  ch file, copies 
33e00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20  the contents to 
33e10 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74  a new path and t
33e20 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74  hen moves .** it
33e30 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c   back.  The newl
33e40 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73  y created file's
33e50 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
33e60 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20   is assigned to 
33e70 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c  the.** conch fil
33e80 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
33e90 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67  finally the orig
33ea0 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20  inal conch file 
33eb0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a  descriptor is .*
33ec0 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72  * closed.  Retur
33ed0 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65  ns zero if succe
33ee0 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssful..*/.static
33ef0 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43   int proxyBreakC
33f00 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
33f10 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
33f20 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72   myHostID){.  pr
33f30 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33f40 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
33f50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33f60 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
33f70 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
33f80 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
33f90 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
33fa0 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d  ;.  char tPath[M
33fb0 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68  AXPATHLEN];.  ch
33fc0 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58  ar buf[PROXY_MAX
33fd0 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  CONCHLEN];.  cha
33fe0 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d  r *cPath = pCtx-
33ff0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a  >conchFilePath;.
34000 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e    size_t readLen
34010 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70   = 0;.  size_t p
34020 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68  athLen = 0;.  ch
34030 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20  ar errmsg[64] = 
34040 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  "";.  int fd = -
34050 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31  1;.  int rc = -1
34060 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
34070 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a  ETER(myHostID);.
34080 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e  .  /* create a n
34090 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61  ew path by repla
340a0 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  ce the trailing 
340b0 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d  '-conch' with '-
340c0 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68  break' */.  path
340d0 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50  Len = strlcpy(tP
340e0 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50  ath, cPath, MAXP
340f0 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70  ATHLEN);.  if( p
34100 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45  athLen>MAXPATHLE
34110 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c  N || pathLen<6 |
34120 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79  | .     (strlcpy
34130 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d  (&tPath[pathLen-
34140 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20  5], "break", 6) 
34150 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c  != 5) ){.    sql
34160 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
34170 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
34180 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20  msg,"path error 
34190 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70  (len %d)",(int)p
341a0 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  athLen);.    got
341b0 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
341c0 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74  .  }.  /* read t
341d0 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74  he conch content
341e0 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20   */.  readLen = 
341f0 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  osPread(conchFil
34200 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59  e->h, buf, PROXY
34210 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29  _MAXCONCHLEN, 0)
34220 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  ;.  if( readLen<
34230 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
34240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
34250 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
34260 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72  rrmsg),errmsg,"r
34270 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ead error (len %
34280 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e  d)",(int)readLen
34290 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
342a0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
342b0 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74   /* write it out
342c0 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72   to the temporar
342d0 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a  y break file */.
342e0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
342f0 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57  en(tPath, (O_RDW
34300 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  R|O_CREAT|O_EXCL
34310 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3c  ), 0);.  if( fd<
34320 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
34330 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
34340 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
34350 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64  , "create failed
34360 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
34370 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
34380 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
34390 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62  ( osPwrite(fd, b
343a0 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
343b0 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64  != (ssize_t)read
343c0 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
343d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
343e0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
343f0 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65  sg, "write faile
34400 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
34410 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
34420 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
34430 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c  f( rename(tPath,
34440 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73   cPath) ){.    s
34450 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34460 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
34470 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
34480 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
34490 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
344a0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
344b0 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
344c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
344d0 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
344e0 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
344f0 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  ;.  robust_close
34500 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c  (pFile, conchFil
34510 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
34520 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20  .  conchFile->h 
34530 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  = fd;.  conchFil
34540 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  e->openFlags = O
34550 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
34560 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a  ..end_breaklock:
34570 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
34580 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
34590 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61      osUnlink(tPa
345a0 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  th);.      robus
345b0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66  t_close(pFile, f
345c0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
345d0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
345e0 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
345f0 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c  to break stale l
34600 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22  ock on %s, %s\n"
34610 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29  , cPath, errmsg)
34620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
34630 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68  c;.}../* Take th
34640 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
34650 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
34660 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73  le and break a s
34670 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65  tale lock if the
34680 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74   .** host id mat
34690 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ches..*/.static 
346a0 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  int proxyConchLo
346b0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
346c0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
346d0 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70  tID, int lockTyp
346e0 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
346f0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
34700 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
34710 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
34720 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
34730 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
34740 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
34750 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20  onchFile;.  int 
34760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34770 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30    int nTries = 0
34780 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  ;.  struct times
34790 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  pec conchModTime
347a0 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63  ;.  .  memset(&c
347b0 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20  onchModTime, 0, 
347c0 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54  sizeof(conchModT
347d0 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  ime));.  do {.  
347e0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
347f0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
34800 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
34810 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
34820 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73  ype);.    nTries
34830 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   ++;.    if( rc=
34840 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
34850 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
34860 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73  lock failed (bus
34870 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74  y):.       * 1st
34880 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f   try: get the mo
34890 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  d time of the co
348a0 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61  nch, wait 0.5s a
348b0 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20  nd try again. . 
348c0 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a        * 2nd try:
348d0 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64   fail if the mod
348e0 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72   time changed or
348f0 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66 66   host id is diff
34900 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20  erent, wait .   
34910 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
34920 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 61  10 sec and try a
34930 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72  gain.       * 3r
34940 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65  d try: break the
34950 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65   lock unless the
34960 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68   mod time has ch
34970 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f  anged..       */
34980 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
34990 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66  at buf;.      if
349a0 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46  ( osFstat(conchF
349b0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
349c0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
349d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
349e0 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
349f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
34a00 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
34a10 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
34a20 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
34a30 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
34a40 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
34a50 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
34a60 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
34a70 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
34a80 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
34a90 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
34aa0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
34ab0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
34ac0 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
34ad0 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
34ae0 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
34af0 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
34b00 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
34b10 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
34b20 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
34b30 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
34b40 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
34b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
34b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34b70 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
34b80 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
34b90 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
34ba0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
34bb0 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
34bc0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
34bd0 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
34be0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
34bf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
34c00 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
34c10 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
34c20 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
34c30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
34c40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34c60 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58      if( len>PROX
34c70 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74  Y_PATHINDEX && t
34c80 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52  Buf[0]==(char)PR
34c90 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
34ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
34cb0 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
34cc0 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74  lock if the host
34cd0 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   id doesn't matc
34ce0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  h */.          i
34cf0 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42  f( 0!=memcmp(&tB
34d00 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
34d10 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
34d20 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
34d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
34d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
34d50 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
34d60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34d70 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
34d80 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
34d90 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72  on short read or
34da0 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61   a version misma
34db0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
34dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
34dd0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
34de0 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
34df0 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  000000); /* wait
34e00 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
34e10 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a  the lock again *
34e20 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
34e30 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue; .      }.   
34e40 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74     .      assert
34e50 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20  ( nTries==3 );. 
34e60 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78       if( 0==prox
34e70 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
34e80 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29  pFile, myHostID)
34e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
34eb0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
34ec0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
34ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34ee0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
34ef0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
34f00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
34f10 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
34f20 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20  CK);          . 
34f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34f40 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
34f50 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
34f60 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
34f70 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
34f80 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
34f90 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ockType);.      
34fa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34fb0 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d  }.  } while( rc=
34fc0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
34fd0 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20  nTries<3 );.  . 
34fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34ff0 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * Takes the conc
35000 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
35010 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
35020 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
35030 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
35040 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
35050 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
35060 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
35070 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
35080 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
35090 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
350a0 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
350b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
350c0 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
350d0 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
350e0 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
350f0 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
35100 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
35110 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
35120 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
35130 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
35140 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
35150 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
35160 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
35170 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35180 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
35190 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
351a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
351b0 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
351c0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
351d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
351e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
351f0 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
35200 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
35210 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
35220 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f  .    uuid_t myHo
35230 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45  stID;.    int pE
35240 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68  rror = 0;.    ch
35250 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59  ar readBuf[PROXY
35260 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
35270 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
35280 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
35290 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b    char *tempLock
352a0 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
352b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
352c0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65  _OK;.    int cre
352d0 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20  ateConch = 0;.  
352e0 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63    int hostIdMatc
352f0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  h = 0;.    int r
35300 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  eadLen = 0;.    
35310 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61  int tryOldLockPa
35320 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  th = 0;.    int 
35330 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
35340 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f   = 0;.    .    O
35350 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
35360 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
35370 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
35380 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
35390 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
353a0 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
353b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
353c0 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
353d0 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20  id()));..    rc 
353e0 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  = proxyGetHostID
353f0 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72  (myHostID, &pErr
35400 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  or);.    if( (rc
35410 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
35420 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46  OERR ){.      pF
35430 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
35440 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67   pError;.      g
35450 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
35460 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
35470 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
35480 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
35490 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
354a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
354b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
354c0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
354d0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
354e0 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
354f0 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
35500 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
35510 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
35520 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
35530 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
35540 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
35550 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
35560 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
35570 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
35580 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
35590 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70  dRead */.      p
355a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
355b0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  = conchFile->las
355c0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
355d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
355e0 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f  READ;.      goto
355f0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
35600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
35610 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45  adLen<=(PROXY_HE
35620 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
35630 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20  STIDLEN) || .   
35640 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75            readBu
35650 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58  f[0]!=(char)PROX
35660 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29  Y_CONCHVERSION )
35670 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
35680 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69  rt read or versi
35690 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74  on format mismat
356a0 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  ch means we need
356b0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
356c0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68   .      ** conch
356d0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f   file. .      */
356e0 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e  .      createCon
356f0 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ch = 1;.    }.  
35700 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74    /* if the host
35710 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20   id matches and 
35720 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c  the lock path al
35730 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
35740 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a  the conch.    **
35750 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73   we'll try to us
35760 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65  e the path there
35770 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70  , if we can't op
35780 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65  en that path, we
35790 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72  'll .    ** retr
357a0 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74  y with a new aut
357b0 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68  o-generated path
357c0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20   .    */.    do 
357d0 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  { /* in case we 
357e0 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69  need to try agai
357f0 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20  n for an :auto: 
35800 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20  named lock file 
35810 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63  */..      if( !c
35820 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66  reateConch && !f
35830 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
35840 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49  ){.        hostI
35850 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70  dMatch = !memcmp
35860 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  (&readBuf[PROXY_
35870 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
35880 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20  stID, .         
35890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358a0 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48           PROXY_H
358b0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
358c0 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
358d0 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
358e0 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
358f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
35900 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
35910 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
35920 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61    /* for auto-na
35930 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  med local lock f
35940 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20  ile, just check 
35950 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
35960 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  we'll.          
35970 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
35980 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
35990 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
359a0 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  in there.       
359b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
359c0 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
359d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
359e0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
359f0 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58   (readLen - PROX
35a00 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20  Y_PATHINDEX);.  
35a10 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
35a20 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c         if( pathL
35a30 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  en>=MAXPATHLEN )
35a40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35a50 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c  pathLen=MAXPATHL
35a60 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  EN-1;.          
35a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
35a80 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c  memcpy(lockPath,
35a90 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
35aa0 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68  PATHINDEX], path
35ab0 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Len);.          
35ac0 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c    lockPath[pathL
35ad0 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
35ae0 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
35af0 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
35b00 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
35b10 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
35b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65            /* cre
35b30 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
35b40 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74  e lock path if t
35b50 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
35b60 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
35b70 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
35b80 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nch;.          }
35b90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
35ba0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20  f( hostIdMatch. 
35bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
35bc0 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
35bd0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26  lockProxyPath, &
35be0 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
35bf0 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20  THINDEX],.      
35c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c10 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f       readLen-PRO
35c20 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20  XY_PATHINDEX).  
35c30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35c40 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74     /* conch host
35c50 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d   and lock path m
35c60 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
35c70 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
35c80 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d  onch; .        }
35c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
35ca0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
35cb0 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74  conch isn't writ
35cc0 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74  able and doesn't
35cd0 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74   match, we can't
35ce0 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20   take it */.    
35cf0 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65    if( (conchFile
35d00 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
35d10 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  WR) == 0 ){.    
35d20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35d30 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
35d40 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
35d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d60 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72  .      /* either
35d70 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27   the conch didn'
35d80 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65  t match or we ne
35d90 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
35da0 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  ew one */.      
35db0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
35dc0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
35dd0 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
35de0 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
35df0 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
35e00 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
35e10 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
35e20 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
35e30 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
35e40 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
35e50 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74  path _only_ if t
35e60 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
35e70 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
35e80 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64     .      /* upd
35e90 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
35ea0 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
35eb0 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
35ec0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
35ed0 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61      ** has a sha
35ee0 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79  red lock already
35ef0 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ), if the host i
35f00 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74  d matches, use t
35f10 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20  he big.      ** 
35f20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stick..      */.
35f30 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f        futimes(co
35f40 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c  nchFile->h, NULL
35f50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73  );.      if( hos
35f60 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65  tIdMatch && !cre
35f70 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
35f80 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
35f90 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e  e->pInode && con
35fa0 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  chFile->pInode->
35fb0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
35fc0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
35fd0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
35fe0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
35ff0 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
36000 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   in this.       
36010 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
36020 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
36030 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
36040 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
36050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
36060 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
36070 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20  e {          .  
36080 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
36090 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
360a0 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43  e, myHostID, EXC
360b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
360c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
360d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
360e0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
360f0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
36100 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
36110 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f  File, EXCLUSIVE_
36120 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
36130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36150 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66    char writeBuff
36160 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  er[PROXY_MAXCONC
36170 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
36180 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30  nt writeSize = 0
36190 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
361a0 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30     writeBuffer[0
361b0 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f  ] = (char)PROXY_
361c0 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20  CONCHVERSION;.  
361d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72        memcpy(&wr
361e0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
361f0 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
36200 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
36210 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
36220 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
36230 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b  oxyPath!=NULL ){
36240 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
36250 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
36260 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
36270 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
36280 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
36290 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  N);.        }els
362a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  e{.          str
362b0 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
362c0 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
362d0 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  X], tempLockPath
362e0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
362f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36300 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f   writeSize = PRO
36310 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73  XY_PATHINDEX + s
36320 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66  trlen(&writeBuff
36330 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
36340 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  EX]);.        ro
36350 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63  bust_ftruncate(c
36360 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69  onchFile->h, wri
36370 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  teSize);.       
36380 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28   rc = unixWrite(
36390 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
363a0 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65  conchFile, write
363b0 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a  Buffer, writeSiz
363c0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  e, 0);.        f
363d0 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  sync(conchFile->
363e0 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  h);.        /* I
363f0 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e  f we created a n
36400 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e  ew conch file (n
36410 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  ot just updated 
36420 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36430 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76  a .         ** v
36440 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29  alid conch file)
36450 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  , try to match t
36460 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
36470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
36480 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
364a0 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43  TE_OK && createC
364b0 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
364c0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
364d0 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
364e0 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74 28 70   err = osFstat(p
364f0 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  File->h, &buf);.
36500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
36510 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
36520 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65      mode_t cmode
36530 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28   = buf.st_mode&(
36540 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20  S_IRUSR|S_IWUSR 
36550 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52  | S_IRGRP|S_IWGR
36560 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  P |.            
36570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36580 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 52              S_IR
36590 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20  OTH|S_IWOTH);.  
365a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79            /* try
365b0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61   to match the da
365c0 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20  tabase file R/W 
365d0 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e  permissions, ign
365e0 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23  ore failure */.#
365f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52  ifndef SQLITE_PR
36600 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20  OXY_DEBUG.      
36610 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 63        osFchmod(c
36620 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
36630 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  de);.#else.     
36640 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
36650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f 73           rc = os
36660 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  Fchmod(conchFile
36670 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20 20  ->h, cmode);.   
36680 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28           }while(
36690 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72 72   rc==(-1) && err
366a0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
366b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
366c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
366d0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
366e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
366f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
36700 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46  rr, "fchmod %o F
36710 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73  AILED with %d %s
36720 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36730 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65             cmode
36740 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
36750 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20  (code));.       
36760 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
36770 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
36780 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
36790 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c  mod %o SUCCEDED\
367a0 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20  n",cmode);.     
367b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
367c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
367d0 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
367e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
367f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
36800 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44  rr, "STAT FAILED
36810 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c  [%d] with %d %s\
36820 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
36830 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f           err, co
36840 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
36850 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e));.#endif.    
36860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36870 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36880 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
36890 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
368a0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
368b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
368c0 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65  K);.      .    e
368d0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20  nd_takeconch:.  
368e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
368f0 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20  ANSPROXY: CLOSE 
36900 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
36910 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
36920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
36930 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
36940 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
36950 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  d;.        if( p
36960 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
36970 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
36980 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
36990 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
369a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
369b0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
369c0 3b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  ;.        fd = r
369d0 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d  obust_open(pCtx-
369e0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  >dbPath, pFile->
369f0 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
36a00 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
36a10 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45  "TRANSPROXY: OPE
36a20 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a  N  %d\n", fd));.
36a30 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d          if( fd>=
36a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
36a50 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
36a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36a70 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
36a80 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20  _CANTOPEN_BKPT; 
36a90 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  /* SQLITE_BUSY? 
36aa0 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
36ab0 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  alled.          
36ac0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
36ad0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
36ae0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
36af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36b00 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
36b10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
36b20 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63   *path = tempLoc
36b30 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b  kPath ? tempLock
36b40 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63  Path : pCtx->loc
36b50 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
36b60 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
36b70 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
36b80 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
36b90 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  oxy, 1);.       
36ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36bb0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
36bc0 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64  _NOMEM && tryOld
36bd0 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
36be0 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
36bf0 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20  dn't create the 
36c00 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
36c10 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63  with the old loc
36c20 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  k file path.    
36c30 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79         ** so try
36c40 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d   again via auto-
36c50 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20  naming .        
36c60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
36c70 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
36c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36c90 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
36ca0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   0;.          co
36cb0 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61  ntinue; /* go ba
36cc0 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20  ck to the do {} 
36cd0 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e  while start poin
36ce0 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a  t, try again */.
36cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36d00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
36d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36d20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
36d30 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70  make a copy of p
36d40 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63  ath if we extrac
36d50 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ted the value.  
36d60 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74         ** from t
36d70 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72  he conch file or
36d80 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c   the path was al
36d90 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
36da0 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f  tack.         */
36db0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d  .        if( tem
36dc0 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  pLockPath ){.   
36dd0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
36de0 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
36df0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
36e00 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20  tempLockPath);. 
36e10 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
36e20 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
36e30 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
36e40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
36e50 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
36e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36e70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
36e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36e90 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
36ea0 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  Held = 1;.      
36eb0 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
36ec0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
36ed0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
36ee0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
36ef0 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
36f00 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b  Context *afpCtx;
36f10 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
36f20 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  x = (afpLockingC
36f30 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c  ontext *)pCtx->l
36f40 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e  ockProxy->lockin
36f50 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
36f60 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61      afpCtx->dbPa
36f70 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
36f80 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
36f90 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
36fa0 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68   {.        conch
36fb0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36fc0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
36fd0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
36fe0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
36ff0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
37000 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
37010 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
37020 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
37030 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
37040 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22  OK?"ok":"failed"
37050 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
37060 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65   rc;.    } while
37070 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65   (1); /* in case
37080 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72   we need to retr
37090 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63  y the :auto: loc
370a0 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20  k file - .      
370b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65             ** we
370c0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65   should never ge
370d0 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69  t here except vi
370e0 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27  a the 'continue'
370f0 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a   call. */.  }.}.
37100 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20  ./*.** If pFile 
37110 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
37120 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68  a conch file, th
37130 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20  en release that 
37140 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
37150 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65  int proxyRelease
37160 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
37170 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
37180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37190 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
371a0 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ine return code 
371b0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  */.  proxyLockin
371c0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20  gContext *pCtx; 
371d0 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
371e0 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  context for the 
371f0 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20  proxy lock */.  
37200 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
37210 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ile;        /* N
37220 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
37230 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78   file */..  pCtx
37240 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
37250 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
37260 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
37270 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  .  conchFile = p
37280 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
37290 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
372a0 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  ASECONCH  %d for
372b0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
372c0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
372d0 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
372e0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
372f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37300 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
37310 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
37320 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43  id()));.  if( pC
37330 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
37340 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63  ){.    rc = conc
37350 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37360 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
37370 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
37380 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
37390 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
373a0 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  d = 0;.  OSTRACE
373b0 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
373c0 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
373d0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
373e0 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
373f0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
37400 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72  led")));.  retur
37410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
37420 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
37430 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
37440 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61  , compute the na
37450 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20  me of its conch 
37460 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  file..** Store t
37470 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
37480 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  e in memory obta
37490 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
374a0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d  3_malloc()..** M
374b0 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  ake *pConchPath 
374c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
374d0 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53   name.  Return S
374e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
374f0 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ess.** or SQLITE
37500 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65  _NOMEM if unable
37510 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72   to obtain memor
37520 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
37530 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
37540 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
37550 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
37560 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  ed memory.** spa
37570 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ce is eventually
37580 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70   freed..**.** *p
37590 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74  ConchPath is set
375a0 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65   to NULL if a me
375b0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
375c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
375d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
375e0 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
375f0 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74  name(char *dbPat
37600 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68  h, char **pConch
37610 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Path){.  int i; 
37620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37630 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
37640 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
37650 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
37660 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65  n(dbPath); /* Le
37670 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65  ngth of database
37680 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61   filename - dbPa
37690 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  th */.  char *co
376a0 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20  nchPath;        
376b0 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20        /* buffer 
376c0 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  in which to cons
376d0 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65  truct conch name
376e0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
376f0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
37700 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
37710 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
37720 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20  he name to.  ** 
37730 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
37740 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
37750 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a  e file. */  .  *
37760 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e  pConchPath = con
37770 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  chPath = (char *
37780 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
37790 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20  len + 8);.  if( 
377a0 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a  conchPath==0 ){.
377b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
377c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
377d0 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c  emcpy(conchPath,
377e0 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b   dbPath, len+1);
377f0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73  .  .  /* now ins
37800 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65  ert a "." before
37810 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72   the last / char
37820 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20  acter */.  for( 
37830 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b  i=(len-1); i>=0;
37840 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   i-- ){.    if( 
37850 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f  conchPath[i]=='/
37860 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
37870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37880 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61   }.  }.  conchPa
37890 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69  th[i]='.';.  whi
378a0 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20  le ( i<len ){.  
378b0 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d    conchPath[i+1]
378c0 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20  =dbPath[i];.    
378d0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61  i++;.  }..  /* a
378e0 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63  ppend the "-conc
378f0 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65  h" suffix to the
37900 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70   file */.  memcp
37910 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31  y(&conchPath[i+1
37920 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b  ], "-conch", 7);
37930 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29  .  assert( (int)
37940 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68  strlen(conchPath
37950 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20  ) == len+7 );.. 
37960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37970 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20  K;.}.../* Takes 
37980 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
37990 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
379a0 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
379b0 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
379c0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
379d0 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
379e0 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
379f0 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
37a00 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
37a10 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
37a20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
37a30 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37a40 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
37a50 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
37a60 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
37a70 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
37a80 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37a90 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  th;.  int rc = S
37aa0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
37ab0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
37ac0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
37ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37ae0 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  BUSY;.  }  ..  /
37af0 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
37b00 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e  if the path is N
37b10 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d  ULL, :auto: or m
37b20 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74  atches the exist
37b30 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66  ing path */.  if
37b40 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b  ( !path || path[
37b50 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72  0]=='\0' || !str
37b60 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f  cmp(path, ":auto
37b70 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50  :") ||.    (oldP
37b80 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28  ath && !strncmp(
37b90 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d  oldPath, path, M
37ba0 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20  AXPATHLEN)) ){. 
37bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37bc0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
37bd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
37be0 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
37bf0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74  ckProxy;.    pCt
37c00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c  x->lockProxy=NUL
37c10 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  L;.    pCtx->con
37c20 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20  chHeld = 0;.    
37c30 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e  if( lockProxy!=N
37c40 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  ULL ){.      rc=
37c50 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
37c60 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
37c70 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50  te3_file *)lockP
37c80 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
37c90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
37cb0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
37cc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37cd0 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b  3_free(oldPath);
37ce0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
37cf0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
37d00 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61  e3DbStrDup(0, pa
37d10 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  th);.  }.  .  re
37d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37d30 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c  * pFile is a fil
37d40 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  e that has been 
37d50 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f  opened by a prio
37d60 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64  r xOpen call.  d
37d70 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74  bPath.** is a st
37d80 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c  ring buffer at l
37d90 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b  east MAXPATHLEN+
37da0 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  1 characters in 
37db0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
37dc0 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68   routine find th
37dd0 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63  e filename assoc
37de0 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65  iated with pFile
37df0 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a   and writes it.*
37e00 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f  * int dbPath..*/
37e10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37e20 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
37e30 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
37e40 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50  pFile, char *dbP
37e50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  ath){.#if define
37e60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69  d(__APPLE__).  i
37e70 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
37e80 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
37e90 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70  ds ){.    /* afp
37ea0 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72   style keeps a r
37eb0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
37ec0 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66  db path in the f
37ed0 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20  ilePath field . 
37ee0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72     ** of the str
37ef0 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  uct */.    asser
37f00 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28  t( (int)strlen((
37f10 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
37f20 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
37f30 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
37f40 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
37f50 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
37f60 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
37f70 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62  kingContext)->db
37f80 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
37f90 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64  );.  } else.#end
37fa0 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
37fb0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c  pMethod == &dotl
37fc0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
37fd0 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
37fe0 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
37ff0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
38000 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
38010 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65  lock.    ** file
38020 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
38030 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63   len = strlen((c
38040 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
38050 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73  kingContext) - s
38060 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55  trlen(DOTLOCK_SU
38070 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70  FFIX);.    memcp
38080 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
38090 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
380a0 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31  Context, len + 1
380b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
380c0 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79  /* all other sty
380d0 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b  les use the lock
380e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
380f0 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65  tore the db file
38100 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73   path */.    ass
38110 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61  ert( strlen((cha
38120 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
38130 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
38140 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
38150 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  lcpy(dbPath, (ch
38160 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
38170 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50  ingContext, MAXP
38180 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72  ATHLEN);.  }.  r
38190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
381a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20  .}../*.** Takes 
381b0 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65  an already fille
381c0 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61  d in unix file a
381d0 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20  nd alters it so 
381e0 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  all file locking
381f0 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72   .** will be per
38200 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f  formed on the lo
38210 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  cal proxy lock f
38220 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ile.  The follow
38230 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72  ing fields.** ar
38240 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74  e preserved in t
38250 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
38260 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  xt so that they 
38270 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
38280 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78  and .** the unix
38290 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65   structure prope
382a0 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61  rly cleaned up a
382b0 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a  t close time:.**
382c0 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65    ->lockingConte
382d0 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64  xt.**  ->pMethod
382e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
382f0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
38300 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  xFile(unixFile *
38310 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
38320 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
38330 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
38340 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64   *pCtx;.  char d
38350 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  bPath[MAXPATHLEN
38360 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  +1];       /* Na
38370 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
38380 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
38390 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c  r *lockPath=NULL
383a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
383b0 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
383c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
383d0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k!=NO_LOCK ){.  
383e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
383f0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78  BUSY;.  }.  prox
38400 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
38410 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50  xFile(pFile, dbP
38420 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74  ath);.  if( !pat
38430 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
38440 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
38450 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b  th, ":auto:") ){
38460 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55  .    lockPath=NU
38470 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
38480 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20   lockPath=(char 
38490 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20  *)path;.  }.  . 
384a0 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
384b0 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73  PROXY  %d for %s
384c0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
384d0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
384e0 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63   (lockPath ? loc
384f0 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  kPath : ":auto:"
38500 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
38510 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33    pCtx = sqlite3
38520 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
38530 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20  *pCtx) );.  if( 
38540 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCtx==0 ){.    r
38550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
38560 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
38570 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCtx, 0, sizeof
38580 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20  (*pCtx));..  rc 
38590 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  = proxyCreateCon
385a0