/ Hex Artifact Content
Login

Artifact f7d8c6ef5f45111f62a77984053c17e767f9679e:


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 20 20 69  HUNK_SIZE */.  i
1e40: 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20  nt nFetchOut;   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e70: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1e80: 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c  ch refs */.  sql
1e90: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1ea0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1eb0: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
1ec0: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1ed0: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1ee0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ef0: 4f 72 69 67 73 69 7a 65 3b 20 20 20 20 20 20 20  Origsize;       
1f00: 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65    /* Actual size
1f10: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1f20: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1f30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1f40: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
1f50: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1f60: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49   FCNTL_MMAP_LIMI
1f70: 54 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  T value */.  voi
1f80: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1fb0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 69 66 64  d region */.#ifd
1fc0: 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20  ef __QNXNTO__.  
1fd0: 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  int sectorSize; 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65      /* Device se
2000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69  ctor size */.  i
2010: 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74  nt deviceCharact
2020: 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20  eristics;       
2030: 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65     /* Precompute
2040: 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  d device charact
2050: 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64  eristics */.#end
2060: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2070: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2080: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
2090: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
20a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20b0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
20c0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
20d0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
20e0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20f0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
2100: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
2110: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
2140: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
2150: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
2160: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2170: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
2180: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
2190: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
21a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
21b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21c0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
21d0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
21e0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
21f0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
2200: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
2210: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
2220: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2230: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2240: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2250: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2260: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2270: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2280: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2290: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
22a0: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
22b0: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
22c0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
22d0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
22e0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
22f0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
2300: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
2310: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
2320: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2330: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2340: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2350: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2360: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2370: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2380: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2390: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
23a0: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
23b0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
23c0: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
23d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
23e0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
23f0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
2400: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
2410: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
2420: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2430: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2440: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2450: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2460: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2470: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2480: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2490: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
24a0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
24b0: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
24c0: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
24d0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
24e0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
24f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
2500: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2510: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
2520: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
2530: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
2540: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
2550: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a       0x01     /*
2560: 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   Connections fro
2570: 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e  m one process on
2580: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2590: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  IXFILE_RDONLY   
25a0: 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43     0x02     /* C
25b0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
25c0: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
25d0: 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  e UNIXFILE_PERSI
25e0: 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20  ST_WAL 0x04     
25f0: 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41  /* Persistent WA
2600: 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  L mode */.#ifnde
2610: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2620: 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e  _DIRSYNC.# defin
2630: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
2640: 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  NC    0x08     /
2650: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
2660: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65   needed */.#else
2670: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2680: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2690: 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  00.#endif.#defin
26a0: 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  e UNIXFILE_PSOW 
26b0: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
26c0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
26d0: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
26e0: 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ITE */.#define U
26f0: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20  NIXFILE_DELETE  
2700: 20 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20      0x20     /* 
2710: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
2720: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2730: 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20  ILE_URI         
2740: 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65  0x40     /* File
2750: 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20  name might have 
2760: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
2770: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2780: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20  FILE_NOLOCK     
2790: 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20   0x80     /* Do 
27a0: 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  no file locking 
27b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
27c0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
27d0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
27e0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
27f0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
2800: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
2810: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
2820: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
2830: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
2840: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
2850: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2860: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2870: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
2880: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2890: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
28a0: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
28b0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
28c0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
28d0: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
28e0: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
28f0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2900: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
2910: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
2920: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
2930: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
2940: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
2950: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
2960: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
2970: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2980: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
2990: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
29a0: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
29b0: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
29c0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
29d0: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
29e0: 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45  ../*.** HAVE_MRE
29f0: 4d 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20  MAP defaults to 
2a00: 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e  true on Linux an
2a10: 64 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65  d false everywhe
2a20: 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20  re else..*/.#if 
2a30: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52  !defined(HAVE_MR
2a40: 45 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e  EMAP).# if defin
2a50: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
2a60: 20 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f   defined(_GNU_SO
2a70: 55 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20  URCE).#  define 
2a80: 48 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20  HAVE_MREMAP 1.# 
2a90: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48  else.#  define H
2aa0: 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65  AVE_MREMAP 0.# e
2ab0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
2ac0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
2ad0: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
2ae0: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2af0: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2b00: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2b10: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2b20: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2b30: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2b40: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2b50: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2b60: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
2b70: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
2b80: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
2b90: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
2ba0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
2bb0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2bc0: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2bd0: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2be0: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2bf0: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2c00: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2c10: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2c20: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2c30: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2c40: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2c50: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
2c60: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
2c70: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
2c80: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
2c90: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
2ca0: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
2cb0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
2cc0: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
2cd0: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
2ce0: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
2cf0: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
2d00: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
2d10: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
2d20: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
2d30: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2d40: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
2d50: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
2d60: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
2d70: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
2d80: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
2d90: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
2da0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2db0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2dc0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2dd0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2de0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2df0: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2e00: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2e10: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2e20: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2e30: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2e40: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2e50: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2e60: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2e70: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2e80: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2e90: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2ea0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2eb0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2ec0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2ed0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2ee0: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2ef0: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2f00: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2f10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2f30: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2f40: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2f60: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2f70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2f80: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2f90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2fa0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2fb0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2fc0: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2fd0: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2fe0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2ff0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
3000: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
3010: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
3020: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3030: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
3040: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
3050: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
3060: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3070: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
3080: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
3090: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
30a0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
30b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
30c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
30d0: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
30e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
30f0: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
3100: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
3110: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
3120: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3130: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
3140: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
3150: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
3160: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3170: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
3180: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
3190: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
31a0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
31b0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
31c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
31d0: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
31e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
31f0: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
3200: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
3210: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
3220: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
3230: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
3240: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
3250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
3260: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
3270: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
3280: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
3290: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
32a0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
32b0: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
32c0: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
32d0: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
32e0: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
32f0: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3300: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3310: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3320: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3330: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3340: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
3350: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
3360: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
3370: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3390: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
33a0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
33b0: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
33c0: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
33d0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
33e0: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
33f0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3400: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3410: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3420: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3430: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3440: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
3450: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
3460: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
3470: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
3480: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
3490: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
34a0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34b0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
34c0: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
34d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
34e0: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
34f0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3500: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3510: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3520: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3530: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3540: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
3550: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3560: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
3570: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
3580: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
3590: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
35a0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
35b0: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
35c0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
35d0: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
35e0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35f0: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3600: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3610: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3620: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3630: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3640: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3650: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3660: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3670: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3680: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
3690: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
36a0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
36b0: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
36c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
36d0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
36e0: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
36f0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3700: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3710: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3720: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3730: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3740: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3750: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3760: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
3770: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
3780: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
3790: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
37a0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
37b0: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
37c0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
37d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
37e0: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
37f0: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3800: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3810: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3820: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3830: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3850: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
3860: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
3870: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
3880: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
3890: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
38a0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
38b0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
38c0: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
38d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
38e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
38f0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3900: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3910: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3920: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3930: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3950: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
3960: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3970: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
3980: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
3990: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
39a0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
39b0: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
39c0: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
39d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
39e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
39f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3a00: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3a10: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3a20: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3a30: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3a40: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3a50: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a60: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3a70: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
3a80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3a90: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
3aa0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3ab0: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
3ac0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
3ad0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
3ae0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3af0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3b00: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3b10: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3b20: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3b30: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3b40: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3b50: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
3b60: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3b70: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3b80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3b90: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3ba0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3bb0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3bc0: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3bd0: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3be0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3bf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3c00: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3c10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3c20: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3c30: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3c40: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3c50: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3c60: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
3c70: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c80: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
3c90: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ca0: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
3cb0: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3cc0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3cd0: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3ce0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3cf0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3d10: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3d20: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3d30: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3d40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3d50: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3d60: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3d70: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3d80: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3d90: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3da0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3db0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3dc0: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3dd0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3de0: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3df0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3e00: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3e10: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e  nt)..  { "fchown
3e20: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3e30: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3e40: 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30  sixFchown,     0
3e50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
3e60: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3e70: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
3e80: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
3e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
3ea0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 6d 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a  )mmap,     0 },.
3ed0: 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28  #define osMmap (
3ee0: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
3ef0: 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69  size_t,int,int,i
3f00: 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  nt,off_t))aSysca
3f10: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3f20: 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  ..  { "munmap", 
3f30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3f40: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61  yscall_ptr)munma
3f50: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
3f60: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61  .#define osMunma
3f70: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3f80: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
3f90: 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74  all[22].pCurrent
3fa0: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
3fb0: 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c  AP.  { "mremap",
3fc0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3fd0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d  syscall_ptr)mrem
3fe0: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
3ff0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65  ,.#else.  { "mre
4000: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4010: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4020: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4030: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
4040: 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28  efine osMremap (
4050: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
4060: 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e  size_t,size_t,in
4070: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
4080: 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  23].pCurrent)..}
4090: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
40a0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
40b0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
40c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
40d0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
40e0: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
40f0: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4100: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4110: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4120: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4130: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4140: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4150: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4160: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4170: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
4180: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
4190: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
41a0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
41b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
41c0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
41d0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
41e0: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
41f0: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4200: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4230: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4240: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4250: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4260: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4270: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4280: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4290: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
42a0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
42b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
42c0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
42d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
42e0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
42f0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4300: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4310: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4320: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4330: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4340: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4350: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4360: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4370: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4390: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
43a0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
43b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
43c0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
43d0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
43e0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
43f0: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4400: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4410: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4420: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4430: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4440: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4450: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4460: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4470: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4480: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4490: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
44a0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
44b0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
44c0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
44d0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
44e0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
44f0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4500: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4520: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4530: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4540: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4560: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4570: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4580: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4590: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45a0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
45b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
45c0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
45d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
45e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
45f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4600: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4610: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4620: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4630: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4640: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4650: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4660: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4670: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4680: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4690: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
46a0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
46b0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
46c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
46d0: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
46e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
46f0: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4700: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4710: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4720: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4730: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4740: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4750: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4760: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4770: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4780: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4790: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
47a0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
47b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
47c0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
47d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
47e0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
47f0: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4800: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4810: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4820: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4830: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4840: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4850: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4860: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
4870: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
4880: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
4890: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
48a0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
48b0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
48c0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
48d0: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
48e0: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
48f0: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
4900: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
4910: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
4920: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
4930: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
4940: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4950: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
4960: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
4970: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4980: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4990: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
49a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
49b0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
49c0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
49d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
49e0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
49f0: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4a00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4a10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
4a30: 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f  e open().  Do so
4a40: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c   multiple times,
4a50: 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72   until it either
4a60: 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20   succeeds or.** 
4a70: 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72  fails for some r
4a80: 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  eason other than
4a90: 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66   EINTR..**.** If
4aa0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
4ab0: 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30  on mode "m" is 0
4ac0: 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20   then set it to 
4ad0: 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a  the default for.
4ae0: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  ** SQLite.  The 
4af0: 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54  default is SQLIT
4b00: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
4b10: 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d  ERMISSIONS (norm
4b20: 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73  ally.** 0644) as
4b30: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
4b40: 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20   system umask.  
4b50: 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74  If m is not 0, t
4b60: 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20  hen.** make the 
4b70: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4b80: 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20  de be exactly m 
4b90: 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61  ignoring the uma
4ba0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20  sk..**.** The m 
4bb0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62  parameter will b
4bc0: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  e non-zero only 
4bd0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77  when creating -w
4be0: 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a  al, -journal,.**
4bf0: 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e   and -shm files.
4c00: 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20    We want those 
4c10: 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65  files to have *e
4c20: 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65  xactly* the same
4c30: 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  .** permissions 
4c40: 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  as their origina
4c50: 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64  l database, unad
4c60: 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65  ulterated by the
4c70: 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68   umask..** In th
4c80: 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74  at way, if a dat
4c90: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72  abase file is -r
4ca0: 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72  w-rw-rw or -rw-r
4cb0: 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74  w-r-, and a.** t
4cc0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68  ransaction crash
4cd0: 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65  es and leaves be
4ce0: 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  hind hot journal
4cf0: 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70  s, then any.** p
4d00: 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61  rocess that is a
4d10: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ble to write to 
4d20: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
4d30: 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74  l also be able t
4d40: 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65  o.** recover the
4d50: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   hot journals..*
4d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
4d70: 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ust_open(const c
4d80: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d  har *z, int f, m
4d90: 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20  ode_t m){.  int 
4da0: 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20  fd;.  mode_t m2 
4db0: 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45  = m ? m : SQLITE
4dc0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
4dd0: 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 64 6f 7b  RMISSIONS;.  do{
4de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43  .#if defined(O_C
4df0: 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d  LOEXEC).    fd =
4e00: 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c   osOpen(z,f|O_CL
4e10: 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65  OEXEC,m2);.#else
4e20: 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e  .    fd = osOpen
4e30: 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66  (z,f,m2);.#endif
4e40: 0a 20 20 7d 77 68 69 6c 65 28 20 66 64 3c 30 20  .  }while( fd<0 
4e50: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
4e60: 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29  );.  if( fd>=0 )
4e70: 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29  {.    if( m!=0 )
4e80: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
4e90: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20  tat statbuf;.   
4ea0: 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66     if( osFstat(f
4eb0: 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20  d, &statbuf)==0 
4ec0: 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62  .       && statb
4ed0: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20  uf.st_size==0.  
4ee0: 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66       && (statbuf
4ef0: 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d  .st_mode&0777)!=
4f00: 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m .      ){.    
4f10: 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c      osFchmod(fd,
4f20: 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   m);.      }.   
4f30: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46   }.#if defined(F
4f40: 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21  D_CLOEXEC) && (!
4f50: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
4f60: 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d  C) || O_CLOEXEC=
4f70: 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  =0).    osFcntl(
4f80: 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
4f90: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
4fa0: 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
4fb0: 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  C);.#endif.  }. 
4fc0: 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f   return fd;.}../
4fd0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
4fe0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
4ff0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
5000: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
5010: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
5020: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
5030: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
5040: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
5050: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
5060: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
5070: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
5080: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
5090: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
50a0: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
50b0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
50c0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
50d0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
50e0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
50f0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
5100: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
5110: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
5120: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
5130: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
5140: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
5150: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
5160: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
5170: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
5180: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
5190: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
51a0: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
51b0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
51c0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
51d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
51e0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
51f0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5200: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
5210: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5220: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
5230: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
5240: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
5250: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5260: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5270: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
5280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5290: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
52a0: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
52b0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
52c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
52d0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
52e0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
52f0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5300: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65  .#endif...#if de
5310: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
5320: 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
5330: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
5340: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
5350: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
5360: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
5370: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
5380: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
5390: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
53a0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
53b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
53c0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
53d0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
53e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
53f0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
5400: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
5410: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
5420: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5430: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5440: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5450: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5460: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
5470: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
5480: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
5490: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
54a0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
54b0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
54c0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
54d0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
54e0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
54f0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
5500: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
5510: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
5520: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5530: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5540: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5550: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
5560: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5570: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
5580: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
5590: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
55a0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
55b0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
55c0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
55d0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
55e0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
55f0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
5600: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
5610: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
5620: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
5630: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
5640: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
5650: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
5660: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
5670: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
5680: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
5690: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
56a0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
56b0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
56c0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
56d0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
56e0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
56f0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
5700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
5710: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
5720: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
5730: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5740: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
5750: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
5760: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
5770: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
5780: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
5790: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
57a0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
57b0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
57c0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
57d0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
57e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
57f0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5800: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
5810: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
5820: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5830: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5840: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
5850: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
5860: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
5870: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
5880: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
5890: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
58a0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
58b0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
58c0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
58d0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
58e0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
58f0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
5900: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
5910: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
5920: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
5930: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
5940: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
5950: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
5960: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
5970: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
5980: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
5990: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
59a0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
59b0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
59c0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
59d0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
59e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
59f0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
5a00: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5a10: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
5a20: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5a30: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
5a40: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5a50: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
5a60: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
5a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5a80: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5a90: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
5aa0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
5ab0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
5ac0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
5ad0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
5ae0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
5af0: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
5b00: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
5b10: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
5b20: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
5b30: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
5b40: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
5b50: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
5b70: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
5b80: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
5b90: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
5ba0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
5bb0: 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20  truncate(int h, 
5bc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5bd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
5be0: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
5bf0: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
5c00: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
5c10: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
5c20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5c30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
5c40: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
5c50: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
5c60: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
5c70: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
5c80: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
5c90: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
5ca0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
5cb0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
5cc0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
5cd0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
5ce0: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
5cf0: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
5d00: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
5d10: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
5d20: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
5d30: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
5d40: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
5d50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
5d60: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
5d70: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
5d80: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
5d90: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
5da0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
5db0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
5dc0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
5dd0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
5de0: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
5df0: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
5e00: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
5e10: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
5e20: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
5e30: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
5e40: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
5e50: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
5e60: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
5e70: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
5e80: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
5e90: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
5ea0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
5eb0: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
5ec0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
5ed0: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
5ee0: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
5ef0: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
5f00: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
5f10: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
5f20: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
5f30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
5f40: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
5f50: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
5f60: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
5f70: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
5f80: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
5f90: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
5fa0: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
5fb0: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
5fc0: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
5fd0: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
5fe0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
5ff0: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
6000: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
6010: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
6020: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
6030: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
6040: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
6050: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
6060: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
6070: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
6080: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
6090: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
60a0: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
60b0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
60c0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
60d0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
60e0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
60f0: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
6100: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
6110: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
6120: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
6130: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
6140: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
6150: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6160: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6170: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6180: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6190: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
61a0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
61b0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
61c0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
61d0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
61e0: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
61f0: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
6200: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
6210: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
6220: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
6230: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
6240: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6250: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20  OERR_LOCK) || . 
6260: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6270: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6280: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
6290: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
62a0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
62b0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
62c0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
62d0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
62e0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
62f0: 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  EDLOCK) ){.     
6300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
6310: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  USY;.    }.    /
6320: 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f  * else fall thro
6330: 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50  ugh */.  case EP
6340: 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ERM: .    return
6350: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
6360: 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20    .  /* EDEADLK 
6370: 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
6380: 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63   if a call to fc
6390: 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73  ntl(F_SETLKW) is
63a0: 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20   made. And.  ** 
63b0: 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65  this module neve
63c0: 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63  r makes such a c
63d0: 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64  all. And the cod
63e0: 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65  e in SQLite itse
63f0: 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  lf .  ** asserts
6400: 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45   that SQLITE_IOE
6410: 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65  RR_BLOCKED is ne
6420: 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f  ver returned. Fo
6430: 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a  r these reasons.
6440: 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69    ** this case i
6450: 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64  s also commented
6460: 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73   out. If the sys
6470: 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72  tem does set err
6480: 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20  no to EDEADLK,. 
6490: 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20   ** the default 
64a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
64b0: 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65   code will be re
64c0: 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30  turned. */.#if 0
64d0: 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a  .  case EDEADLK:
64e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
64f0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
6500: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69  ;.#endif.    .#i
6510: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
6520: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
6530: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
6540: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
6550: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
6560: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
6570: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6580: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
6590: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
65a0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
65b0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
65c0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
65d0: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
65e0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
65f0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
6600: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6610: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
6620: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
6630: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
6640: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6650: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6660: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
6670: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
6680: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
6690: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
66a0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
66b0: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
66c0: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69   case ENOENT:.#i
66d0: 66 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20  fdef ESTALE     
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74  /* ESTALE is not
6700: 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65   defined on Inte
6710: 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20  rix systems */. 
6720: 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65   case ESTALE:.#e
6730: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53  ndif.  case ENOS
6740: 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65  YS:.    /* these
6750: 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68   should force th
6760: 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73  e client to clos
6770: 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72  e the file and r
6780: 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20  econnect */.    
6790: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
67a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
67b0: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a  Err;.  }.}..../*
67c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6820: 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69   Begin Unique Fi
6830: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
6840: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6860: 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73  .** On most vers
6870: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65  ions of unix, we
6880: 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75   can get a uniqu
6890: 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20  e ID for a file 
68a0: 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67  by concatenating
68b0: 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e  .** the device n
68c0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e  umber and the in
68d0: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74  ode number.  But
68e0: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77   this does not w
68f0: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
6900: 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61  ** On VxWorks, a
6910: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20   unique file id 
6920: 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e  must be based on
6930: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6940: 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41  ilename..**.** A
6950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
6960: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6970: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6980: 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  re can be used a
6990: 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69  s a.** unique fi
69a0: 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73  le ID in VxWorks
69b0: 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  .  Each instance
69c0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
69d0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
69e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e   copy of the can
69f0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6a00: 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20    There is also 
6a10: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
6a20: 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75  t.  .** The stru
6a30: 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d  cture is reclaim
6a40: 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
6a50: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
6a60: 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a  o it drops to.**
6a70: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
6a80: 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72  re are never ver
6a90: 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65  y many files ope
6aa0: 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e  n at one time an
6ab0: 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f  d lookups are no
6ac0: 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e  t.** a performan
6ad0: 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68  ce-critical path
6ae0: 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69  , so it is suffi
6af0: 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65  cient to put the
6b00: 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  se.** structures
6b10: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6b20: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77  t..*/.struct vxw
6b30: 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73  orksFileId {.  s
6b40: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6b50: 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20  eId *pNext;  /* 
6b60: 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f  Next in a list o
6b70: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20  f them all */.  
6b80: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
6bb0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e  ences to this on
6bc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
6bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6be0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6bf0: 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c  f the zCanonical
6c00: 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f  Name[] string */
6c10: 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69  .  char *zCanoni
6c20: 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  calName;        
6c30: 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69   /* Canonical fi
6c40: 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69  lename */.};..#i
6c50: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20  f OS_VXWORKS./* 
6c60: 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66  .** All unique f
6c70: 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c  ilenames are hel
6c80: 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  d on a linked li
6c90: 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69  st headed by thi
6ca0: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a  s.** variable:.*
6cb0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
6cc0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
6cd0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
6ce0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c   0;../*.** Simpl
6cf0: 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69  ify a filename i
6d00: 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61  nto its canonica
6d10: 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b  l form.** by mak
6d20: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
6d30: 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a  g changes:.**.**
6d40: 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79    * removing any
6d50: 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75   trailing and du
6d60: 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20  plicate /.**  * 
6d70: 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f  convert /./ into
6d80: 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f   just /.**  * co
6d90: 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65  nvert /A/../ whe
6da0: 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70  re A is any simp
6db0: 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73  le name into jus
6dc0: 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  t /.**.** Change
6dd0: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c  s are made in-pl
6de0: 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ace.  Return the
6df0: 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68   new name length
6e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6e10: 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
6e20: 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20   in z[0..n-1].  
6e30: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
6e40: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
6e50: 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69  rs in the simpli
6e60: 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  fied name..*/.st
6e70: 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73  atic int vxworks
6e80: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61  SimplifyName(cha
6e90: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
6ea0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c  int i, j;.  whil
6eb0: 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>1 && z[n-1]
6ec0: 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  =='/' ){ n--; }.
6ed0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
6ee0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
6ef0: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
6f00: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6f10: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
6f20: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6f30: 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26  ='.' && i+2<n &&
6f40: 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+2]=='/' ){.
6f50: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
6f60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
6f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6f80: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
6f90: 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b  && i+3<n && z[i+
6fa0: 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33  2]=='.' && z[i+3
6fb0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6fc0: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
6fd0: 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a  z[j-1]!='/' ){ j
6fe0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  --; }.        if
6ff0: 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  ( j>0 ){ j--; }.
7000: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
7010: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7030: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
7040: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  ];.  }.  z[j] = 
7050: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d  0;.  return j;.}
7060: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75  ../*.** Find a u
7070: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
7080: 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f  r the given abso
7090: 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  lute pathname.  
70a0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
70b0: 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72  ter to the vxwor
70c0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
70d0: 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69    This pointer i
70e0: 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20  s the unique.** 
70f0: 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54  file ID..**.** T
7100: 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66  he nRef field of
7110: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
7120: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63  Id object is inc
7130: 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a  remented before.
7140: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  ** the object is
7150: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65   returned.  A ne
7160: 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  w vxworksFileId 
7170: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
7180: 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74  d.** and added t
7190: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
71a0: 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  t if necessary..
71b0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
71c0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
71d0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
71e0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
71f0: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
7200: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
7210: 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20  indFileId(const 
7220: 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e  char *zAbsoluteN
7230: 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76  ame){.  struct v
7240: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
7250: 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ew;         /* s
7260: 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65  earch key and ne
7270: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73  w file ID */.  s
7280: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7290: 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b  eId *pCandidate;
72a0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
72b0: 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20  g over existing 
72c0: 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e  file IDs */.  in
72d0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
7300: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72  AbsoluteName str
7310: 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
7320: 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b  ( zAbsoluteName[
7330: 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d  0]=='/' );.  n =
7340: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62   (int)strlen(zAb
7350: 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70  soluteName);.  p
7360: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
7370: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
7380: 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20  ew) + (n+1) );. 
7390: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
73a0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
73b0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20  >zCanonicalName 
73c0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
73d0: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  ];.  memcpy(pNew
73e0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
73f0: 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c  , zAbsoluteName,
7400: 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77   n+1);.  n = vxw
7410: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
7420: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
7430: 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a  lName, n);..  /*
7440: 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
7450: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68  xisting entry th
7460: 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  at matching the 
7470: 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a  canonical name..
7480: 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69    ** If found, i
7490: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
74a0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64  erence count and
74b0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
74c0: 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78  r to.  ** the ex
74d0: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a  isting file ID..
74e0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
74f0: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
7500: 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b  Candidate=vxwork
7510: 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64  sFileList; pCand
7520: 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74  idate; pCandidat
7530: 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e  e=pCandidate->pN
7540: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
7550: 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d  andidate->nName=
7560: 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  =n .     && memc
7570: 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a  mp(pCandidate->z
7580: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70  CanonicalName, p
7590: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
75a0: 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29  ame, n)==0.    )
75b0: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
75c0: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
75d0: 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e      pCandidate->
75e0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75  nRef++;.       u
75f0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7600: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  .       return p
7610: 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d  Candidate;.    }
7620: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61  .  }..  /* No ma
7630: 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  tch was found.  
7640: 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e  We will make a n
7650: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7660: 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
7670: 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20    pNew->nName = 
7680: 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  n;.  pNew->pNext
7690: 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69   = vxworksFileLi
76a0: 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c  st;.  vxworksFil
76b0: 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  eList = pNew;.  
76c0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
76d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
76e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
76f0: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
7700: 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77  e count on a vxw
7710: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7720: 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20  t.  Free.** the 
7730: 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20  object when the 
7740: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7750: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f  reaches zero..*/
7760: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77  .static void vxw
7770: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
7780: 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  d(struct vxworks
7790: 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20  FileId *pId){.  
77a0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
77b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d  ;.  assert( pId-
77c0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64  >nRef>0 );.  pId
77d0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
77e0: 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pId->nRef==0 ){.
77f0: 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72      struct vxwor
7800: 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20  ksFileId **pp;. 
7810: 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72     for(pp=&vxwor
7820: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20  ksFileList; *pp 
7830: 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20  && *pp!=pId; pp 
7840: 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
7850: 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28  )){}.    assert(
7860: 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20   *pp==pId );.   
7870: 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78   *pp = pId->pNex
7880: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
7890: 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20  ree(pId);.  }.  
78a0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
78b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  ;.}.#endif /* OS
78c0: 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a  _VXWORKS */./***
78d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
78e0: 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20   of Unique File 
78f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
7900: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
7910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20  ********* Posix 
79e0: 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
79f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
7a10: 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f  .** POSIX adviso
7a20: 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f  ry locks are bro
7a30: 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20  ken by design.  
7a40: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
7a50: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
7a60: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
7a70: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
7a80: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
7a90: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
7aa0: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
7ab0: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
7ac0: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
7ad0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
7ae0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
7af0: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
7b00: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
7b10: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
7b20: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
7b30: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
7b40: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
7b50: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
7b60: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
7b70: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b80: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
7b90: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
7ba0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
7bb0: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
7bc0: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
7bd0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
7be0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
7bf0: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
7c00: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
7c10: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
7c20: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
7c30: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
7c40: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
7c50: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
7c60: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
7c70: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
7c80: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
7c90: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
7ca0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
7cb0: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
7cc0: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
7cd0: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
7ce0: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
7cf0: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
7d00: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
7d10: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
7d20: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
7d30: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
7d40: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
7d50: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
7d60: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
7d70: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
7d80: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
7d90: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
7da0: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
7db0: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
7dc0: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
7dd0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
7de0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
7df0: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
7e00: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
7e10: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
7e20: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hat we cannot us
7e30: 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f  e POSIX locks to
7e40: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c   synchronize fil
7e50: 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e  e access.** amon
7e60: 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65  g competing thre
7e70: 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ads of the same 
7e80: 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20  process.  POSIX 
7e90: 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20  locks will work 
7ea0: 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68  fine.** to synch
7eb0: 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f  ronize access fo
7ec0: 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70  r threads in sep
7ed0: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c  arate processes,
7ee0: 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65   but not.** thre
7ef0: 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  ads within the s
7f00: 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ame process..**.
7f10: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
7f20: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53  d the problem, S
7f30: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e  QLite has to man
7f40: 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69  age file locks i
7f50: 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20  nternally.** on 
7f60: 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76  its own.  Whenev
7f70: 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  er a new databas
7f80: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20  e is opened, we 
7f90: 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65  have to find the
7fa0: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f  .** specific ino
7fb0: 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
7fc0: 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f  se file (the ino
7fd0: 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  de is determined
7fe0: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65   by the.** st_de
7ff0: 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65  v and st_ino fie
8000: 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20  lds of the stat 
8010: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66  structure that f
8020: 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29  stat() fills in)
8030: 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f  .** and check fo
8040: 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20  r locks already 
8050: 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74  existing on that
8060: 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f   inode.  When lo
8070: 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74  cks are.** creat
8080: 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77  ed or removed, w
8090: 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61  e have to look a
80a0: 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e  t our own intern
80b0: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
80c0: 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65  .** locks to see
80d0: 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65   if another thre
80e0: 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  ad has previousl
80f0: 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20  y set a lock on 
8100: 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f  that same.** ino
8110: 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65  de..**.** (Aside
8120: 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f  : The use of ino
8130: 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e  de numbers as un
8140: 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f  ique IDs does no
8150: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
8160: 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b  s..** For VxWork
8170: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73  s, we have to us
8180: 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  e the alternativ
8190: 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74  e unique ID syst
81a0: 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63  em based on.** c
81b0: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
81c0: 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65  e and implemente
81d0: 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  d in the previou
81e0: 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a  s division.).**.
81f0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66  ** The sqlite3_f
8200: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
8210: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
8220: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
8230: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
8240: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
8250: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
8260: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
8270: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
8280: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
8290: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
82a0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
82b0: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
82c0: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
82d0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
82e0: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
82f0: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
8300: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
8310: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
8320: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
8330: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
8340: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
8350: 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ures.** point to
8360: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e   the same lockin
8370: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  g structure.  Th
8380: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8390: 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72  ure keeps.** a r
83a0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28  eference count (
83b0: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
83c0: 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69  when to delete i
83d0: 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a  t) and a "cnt".*
83e0: 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c  * field that tel
83f0: 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e  ls us its intern
8400: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20  al lock status. 
8410: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
8420: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c  e.** file is unl
8430: 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20  ocked.  cnt==-1 
8440: 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68  means the file h
8450: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
8460: 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d  lock..** cnt>0 m
8470: 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63  eans there are c
8480: 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  nt shared locks 
8490: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
84a0: 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  ** Any attempt t
84b0: 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
84c0: 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68   a file first ch
84d0: 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ecks the locking
84e0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
84f0: 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  The fcntl() syst
8500: 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20  em call is only 
8510: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61  invoked to set a
8520: 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20   .** POSIX lock 
8530: 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
8540: 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74  lock structure t
8550: 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65  ransitions betwe
8560: 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61  en.** a locked a
8570: 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73  nd an unlocked s
8580: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20  tate..**.** But 
8590: 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65  wait:  there are
85a0: 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65   yet more proble
85b0: 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64  ms with POSIX ad
85c0: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a  visory locks..**
85d0: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
85e0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
85f0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
8600: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
8610: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
8620: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
8630: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
8640: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
8650: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
8660: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
8670: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
8680: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
8690: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
86a0: 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61  t.** maintains a
86b0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
86c0: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
86d0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f  locks on tha ino
86e0: 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61  de..** When an a
86f0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
8700: 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46  o close an unixF
8710: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
8720: 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46  e.** other unixF
8730: 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ile open on the 
8740: 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20  same inode that 
8750: 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b  are holding lock
8760: 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74  s, the call.** t
8770: 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69  o close() the fi
8780: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
8790: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
87a0: 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
87b0: 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75   clear..** The u
87c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
87d0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
87e0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
87f0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
8800: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
8810: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
8820: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
8830: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
8840: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
8850: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
8860: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
8870: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
8880: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
8890: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
88a0: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
88b0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
88c0: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
88d0: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
88e0: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
88f0: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
8900: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
8910: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
8920: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
8930: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
8940: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
8950: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
8960: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
8970: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
8980: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
8990: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
89a0: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
89b0: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
89c0: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
89d0: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
89e0: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
89f0: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
8a00: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
8a10: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
8a20: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
8a30: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
8a40: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
8a50: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
8a60: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
8a70: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
8a80: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
8a90: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
8aa0: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
8ab0: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
8ac0: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
8ad0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
8ae0: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
8af0: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8b00: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
8b10: 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61   One has to do a
8b20: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
8b30: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8b40: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
8b50: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
8b60: 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ss..**.** SQLite
8b70: 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74   used to support
8b80: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20   LinuxThreads.  
8b90: 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20  But support for 
8ba0: 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20  LinuxThreads.** 
8bb0: 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69  was dropped begi
8bc0: 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69  nning with versi
8bd0: 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74  on 3.7.0.  SQLit
8be0: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  e will still wor
8bf0: 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54  k with.** LinuxT
8c00: 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20  hreads provided 
8c10: 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69  that (1) there i
8c20: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
8c30: 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  ne connection .*
8c40: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66  * per database f
8c50: 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ile in the same 
8c60: 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20  process and (2) 
8c70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8c80: 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d  ions.** do not m
8c90: 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61  ove across threa
8ca0: 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ds..*/../*.** An
8cb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
8cc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
8cd0: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
8ce0: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
8cf0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
8d00: 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49  cular unixInodeI
8d10: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
8d20: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
8d30: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
8d60: 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r */.#if OS_VXWO
8d70: 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77  RKS.  struct vxw
8d80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
8d90: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
8da0: 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e   ID for vxworks.
8db0: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
8dc0: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  t ino;          
8dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
8de0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
8df0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
8e00: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8e10: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8e20: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
8e30: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
8e40: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
8e50: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
8e60: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
8e70: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
8e80: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
8e90: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
8ea0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
8eb0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
8ec0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
8ed0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
8ee0: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
8ef0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
8f00: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8f10: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
8f20: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
8f30: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
8f40: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
8f50: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8f60: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
8f70: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
8f80: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
8f90: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  fo {.  struct un
8fa0: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
8fb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
8fc0: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
8fd0: 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20  t nShared;      
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
9000: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
9010: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9020: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
9030: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
9040: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
9050: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
9060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
9070: 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20  ProcessLock;    
9080: 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65   /* An exclusive
9090: 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73   process lock is
90a0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
90b0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
90c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
90d0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
90e0: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
90f0: 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  re */.  unixShmN
9100: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
9110: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
9120: 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
9130: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
9140: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
9150: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
9160: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9170: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
9180: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
9190: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
91a0: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
91b0: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
91c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
91d0: 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49  close */.  unixI
91e0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
91f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
9200: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
9210: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9220: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9230: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
9240: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
9250: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9260: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9270: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
9280: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
9290: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
92a0: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
92b0: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
92c0: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
92d0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
92e0: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9300: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
9310: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
9320: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
9330: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
9340: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
9350: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9360: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
9370: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
9380: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
9390: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
93a0: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
93b0: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a  ist = 0;../*.**.
93c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
93d0: 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f   - unixLogError_
93e0: 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65  x(), is only eve
93f0: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
9400: 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f   macro.** unixLo
9410: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
9420: 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  It is invoked af
9430: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
9440: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
9450: 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20  ction and errno 
9460: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e  has been.** set.
9470: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
9480: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
9490: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
94a0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
94b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20  lue of.** errno 
94c0: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
94d0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
94e0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
94f0: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9500: 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  or.** strerror_r
9510: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
9520: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
9530: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
9540: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
9550: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
9560: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
9570: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
9580: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
9590: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
95a0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
95b0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
95c0: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
95d0: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
95e0: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
95f0: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
9600: 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20  (e.g. "unlink", 
9610: 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20  "open") and the 
9620: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
9630: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
9640: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
9650: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
9660: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
9670: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
9680: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
9690: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67  atic int unixLog
96a0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
96b0: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96d0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
96e0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
96f0: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
9700: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9710: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
9720: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
9730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
9740: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
9750: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
9760: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
9770: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
9780: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
9790: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
97a0: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
97b0: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
97c0: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
97d0: 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20   *zErr;         
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
97f0: 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65  essage from stre
9800: 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61  rror() or equiva
9810: 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45  lent */.  int iE
9820: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20  rrno = errno;   
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
9840: 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72  ed syscall error
9850: 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a   number */..  /*
9860: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
9870: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9880: 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ld (SQLITE_THREA
9890: 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20  DSAFE==0), then 
98a0: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72  use.  ** the str
98b0: 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  error() function
98c0: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68   to obtain the h
98d0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72  uman-readable er
98e0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
98f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65   equivalent to e
9900: 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
9910: 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28   use strerror_r(
9920: 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c  )..  */ .#if SQL
9930: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
9940: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  & defined(HAVE_S
9950: 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61  TRERROR_R).  cha
9960: 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65  r aErr[80];.  me
9970: 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69  mset(aErr, 0, si
9980: 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a  zeof(aErr));.  z
9990: 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f  Err = aErr;..  /
99a0: 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f  * If STRERROR_R_
99b0: 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61  CHAR_P (set by a
99c0: 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29  utoconf scripts)
99d0: 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73   or __USE_GNU is
99e0: 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61   defined,.  ** a
99f0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
9a00: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
9a10: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f  he GNU version o
9a20: 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74  f strerror_r() t
9a30: 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  hat.  ** returns
9a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9a50: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9a60: 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
9a70: 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65  age. That pointe
9a80: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e  r .  ** may poin
9a90: 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20  t to aErr[], or 
9aa0: 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  it may point to 
9ab0: 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72  some static stor
9ac0: 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a  age somewhere. .
9ad0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
9ae0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9af0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9b00: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
9b10: 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72  n of .  ** strer
9b20: 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61  ror_r(), which a
9b30: 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20  lways writes an 
9b40: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9b50: 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a  to aErr[]..  **.
9b60: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65    ** If the code
9b70: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73   incorrectly ass
9b80: 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
9b90: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
9ba0: 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61  n that is.  ** a
9bb0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72  vailable, the er
9bc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
9bd0: 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70   often be an emp
9be0: 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61  ty string. Not a
9bf0: 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c  .  ** huge probl
9c00: 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20  em. Incorrectly 
9c10: 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20  concluding that 
9c20: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9c30: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20  is available .  
9c40: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
9c50: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75   a segfault thou
9c60: 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  gh..  */.#if def
9c70: 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f  ined(STRERROR_R_
9c80: 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e  CHAR_P) || defin
9c90: 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20  ed(__USE_GNU).  
9ca0: 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a  zErr = .# endif.
9cb0: 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72    strerror_r(iEr
9cc0: 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f  rno, aErr, sizeo
9cd0: 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c  f(aErr)-1);..#el
9ce0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
9cf0: 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69  SAFE.  /* This i
9d00: 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  s a threadsafe b
9d10: 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72  uild, but strerr
9d20: 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76  or_r() is not av
9d30: 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45  ailable. */.  zE
9d40: 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20  rr = "";.#else. 
9d50: 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61   /* Non-threadsa
9d60: 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74  fe build, use st
9d70: 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a  rerror(). */.  z
9d80: 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69  Err = strerror(i
9d90: 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  Errno);.#endif..
9da0: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
9db0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73   zPath = "";.  s
9dc0: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
9dd0: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e  de,.      "os_un
9de0: 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  ix.c:%d: (%d) %s
9df0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
9e00: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
9e10: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
9e20: 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Err.  );..  retu
9e30: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
9e40: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
9e50: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
9e60: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68  .** We assume th
9e70: 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73  at close() almos
9e80: 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20  t always works, 
9e90: 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  since it is only
9ea0: 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69   in a.** very si
9eb0: 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f  ck application o
9ec0: 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b  r on a very sick
9ed0: 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69   platform that i
9ee0: 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a  t might fail..**
9ef0: 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c   If it does fail
9f00: 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68  , simply leak th
9f10: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9f20: 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68  r, but do log th
9f30: 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e.** error..**.*
9f40: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
9f50: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65  s not safe to re
9f60: 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65  try close() afte
9f70: 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68  r EINTR since th
9f80: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
9f90: 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  ptor might have 
9fa0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75  already been reu
9fb0: 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74  sed by another t
9fc0: 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20  hread..** So we 
9fd0: 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74  don't even try t
9fe0: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
9ff0: 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c  n EINTR.  Just l
a000: 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  og the error.** 
a010: 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a  and move on..*/.
a020: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75  static void robu
a030: 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c  st_close(unixFil
a040: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c  e *pFile, int h,
a050: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
a060: 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29  if( osClose(h) )
a070: 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  {.    unixLogErr
a080: 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f  orAtLine(SQLITE_
a090: 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c  IOERR_CLOSE, "cl
a0a0: 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ose",.          
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
a0c0: 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le ? pFile->zPat
a0d0: 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  h : 0, lineno);.
a0e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
a0f0: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
a100: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
a110: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
a120: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
a130: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
a140: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
a150: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
a160: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
a170: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a180: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a190: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a1a0: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
a1b0: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
a1c0: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
a1d0: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
a1e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
a1f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75  >pNext;.    robu
a200: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
a210: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
a220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a230: 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e  ee(p);.  }.  pIn
a240: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ode->pUnused = 0
a250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
a260: 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e  se a unixInodeIn
a270: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
a280: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
a290: 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d by findInodeIn
a2a0: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
a2b0: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a2c0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a2d0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a2e0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a2f0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a300: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a320: 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
a330: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a340: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
a350: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
a360: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
a370: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
a380: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  ld() );.  if( AL
a390: 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a  WAYS(pInode) ){.
a3a0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
a3b0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
a3c0: 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
a3d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a3e0: 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30  ode->pShmNode==0
a3f0: 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   );.      closeP
a400: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
a410: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
a420: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
a430: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a440: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
a450: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
a460: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
a470: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
a480: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
a490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a4a0: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
a4b0: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
a4c0: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
a4d0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
a4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a4f0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
a500: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a510: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
a520: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
a530: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
a540: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
a550: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
a560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a570: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
a580: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
a590: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
a5a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a5b0: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
a5c0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
a5d0: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
a5e0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
a5f0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
a600: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
a610: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a620: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
a630: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
a640: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
a650: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
a660: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a670: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a680: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a690: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a6a0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a6b0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a6c0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
a6d0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
a6e0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
a6f0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
a700: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
a710: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
a720: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
a730: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
a740: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
a750: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
a760: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
a770: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
a780: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
a790: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
a7a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
a7d0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
a7e0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
a810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
a820: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
a830: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
a840: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
a850: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
a860: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
a870: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
a880: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
a890: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
a8a0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
a8b0: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
a8c0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
a8d0: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
a8e0: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
a8f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
a900: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
a910: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
a920: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
a930: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a940: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
a950: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
a960: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
a970: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
a980: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
a990: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
a9a0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
a9b0: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
a9c0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  !=0 ){.    pFile
a9d0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
a9e0: 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45  rno;.#ifdef EOVE
a9f0: 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46  RFLOW.    if( pF
aa00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
aa10: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
aa20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
aa30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    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 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41  .  }..#ifdef __A
aa60: 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f  PPLE__.  /* On O
aa70: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
aa80: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
aa90: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
aaa0: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
aab0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
aac0: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
aad0: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
aae0: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
aaf0: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
ab00: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
ab10: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
ab20: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
ab30: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
ab40: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
ab50: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
ab60: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
ab70: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
ab80: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
ab90: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
aba0: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
abb0: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
abc0: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
abd0: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
abe0: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
abf0: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
ac00: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
ac10: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
ac20: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
ac30: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
ac40: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
ac50: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
ac60: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
ac70: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
ac80: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
ac90: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
aca0: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
acb0: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
acc0: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
acd0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28  .st_size==0 && (
ace0: 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
acf0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
ad00: 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a  IS_MSDOS)!=0 ){.
ad10: 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57      do{ rc = osW
ad20: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
ad30: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
ad40: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
ad50: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20  ;.    if( rc!=1 
ad60: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
ad70: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
ad80: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
ad90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
ada0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46    }.    rc = osF
adb0: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
adc0: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
add0: 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
ade0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
adf0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
ae00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ae10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ae20: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
ae30: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
ae40: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
ae50: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
ae60: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
ae70: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
ae80: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
ae90: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
aea0: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
aeb0: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70  _ino;.#endif.  p
aec0: 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
aed0: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  t;.  while( pIno
aee0: 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  de && memcmp(&fi
aef0: 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66  leId, &pInode->f
af00: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
af10: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49  leId)) ){.    pI
af20: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
af30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
af40: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
af50: 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65   pInode = sqlite
af60: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
af70: 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20  (*pInode) );.   
af80: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
af90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
afa0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
afb0: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49   }.    memset(pI
afc0: 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  node, 0, sizeof(
afd0: 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d  *pInode));.    m
afe0: 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66  emcpy(&pInode->f
aff0: 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20  ileId, &fileId, 
b000: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
b010: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
b020: 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64  f = 1;.    pInod
b030: 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65  e->pNext = inode
b040: 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65  List;.    pInode
b050: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
b060: 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29   if( inodeList )
b070: 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65   inodeList->pPre
b080: 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20  v = pInode;.    
b090: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
b0a0: 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
b0b0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b   pInode->nRef++;
b0c0: 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20  .  }.  *ppInode 
b0d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75  = pInode;.  retu
b0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b0f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b100: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
b110: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
b120: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
b130: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
b140: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
b150: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
b160: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
b170: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
b180: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
b190: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
b1a0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
b1b0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
b1c0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
b1d0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
b1e0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
b1f0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
b200: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
b210: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
b220: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
b230: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
b240: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
b250: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
b260: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b270: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
b280: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
b290: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b2a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
b2b0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b2c0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
b2d0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b2e0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
b2f0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
b300: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
b310: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
b320: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
b330: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
b340: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
b350: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
b360: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
b370: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
b380: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
b390: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
b3a0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
b3b0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
b3c0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
b3d0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
b3e0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
b3f0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
b400: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
b410: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
b420: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
b430: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
b440: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
b450: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
b470: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
b480: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b490: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
b4a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b4b0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
b4c0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
b4d0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
b4e0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
b4f0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
b500: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
b510: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b520: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  DLOCK;.      pFi
b530: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b540: 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
b550: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
b560: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
b570: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
b580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b590: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
b5a0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
b5b0: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
b5c0: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
b5d0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
b5e0: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
b5f0: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
b600: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
b610: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
b620: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
b630: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
b640: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
b650: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
b660: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
b670: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
b680: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
b690: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
b6a0: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
b6b0: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
b6c0: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
b6d0: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
b6e0: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
b6f0: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
b700: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
b710: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
b720: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
b730: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
b740: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
b750: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
b760: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
b770: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
b780: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
b790: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
b7a0: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
b7b0: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
b7c0: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
b7d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
b7e0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
b7f0: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
b800: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
b810: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
b820: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
b830: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
b840: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
b850: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b860: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
b870: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
b880: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
b890: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
b8a0: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
b8b0: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
b8c0: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
b8d0: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
b8e0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
b8f0: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
b900: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
b910: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
b920: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
b930: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
b940: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
b950: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
b960: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
b970: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
b980: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
b990: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
b9a0: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
b9b0: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
b9c0: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
b9d0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e  int rc;.  unixIn
b9e0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
b9f0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ba00: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
ba10: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
ba20: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
ba30: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69  0 );.  if( ((pFi
ba40: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
ba50: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d  UNIXFILE_EXCL)!=
ba60: 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72  0 || pInode->bPr
ba70: 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26  ocessLock).   &&
ba80: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
ba90: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
baa0: 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a  DONLY)==0).  ){.
bab0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
bac0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
bad0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
bae0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
baf0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
bb00: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ->nLock==0 );.  
bb10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
bb20: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
bb30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bb40: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
bb50: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
bb60: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
bb70: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
bb80: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
bb90: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
bba0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
bbb0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
bbc0: 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74    if( rc<0 ) ret
bbd0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49  urn rc;.      pI
bbe0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
bbf0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ck = 1;.      pI
bc00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
bc10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc20: 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
bc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
bc40: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
bc50: 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b  , F_SETLK, pLock
bc60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bc70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
bc80: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
bc90: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
bca0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
bcb0: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
bcc0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
bcd0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
bce0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
bcf0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
bd00: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
bd10: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
bd20: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
bd30: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
bd40: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
bd50: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
bd60: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
bd70: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
bd80: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
bd90: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
bda0: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
bdb0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
bdc0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
bdd0: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
bde0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
bdf0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
be00: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
be10: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
be20: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
be30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
be40: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
be50: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
be60: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
be70: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
be80: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
be90: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
bea0: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
beb0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
bec0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
bed0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
bee0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
bef0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
bf00: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
bf10: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
bf20: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
bf30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
bf40: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
bf50: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
bf60: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
bf70: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
bf80: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
bf90: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
bfa0: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
bfb0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
bfc0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
bfd0: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
bfe0: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
bff0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c000: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
c010: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
c020: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
c030: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
c040: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
c050: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
c060: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
c070: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
c080: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
c090: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
c0a0: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
c0b0: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
c0c0: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
c0d0: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
c0e0: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
c0f0: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
c100: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
c110: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
c120: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
c130: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
c140: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
c150: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
c160: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
c170: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
c180: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
c190: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
c1a0: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
c1b0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c1c0: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
c1d0: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
c1e0: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
c1f0: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
c200: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
c210: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c220: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
c230: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
c240: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
c250: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
c260: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
c270: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
c280: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
c290: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
c2a0: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
c2b0: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
c2c0: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
c2d0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
c2e0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c2f0: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
c300: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
c310: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
c320: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
c330: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
c340: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
c350: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
c360: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
c370: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
c380: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
c390: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
c3a0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
c3b0: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
c3c0: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
c3d0: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
c3e0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
c3f0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
c400: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
c410: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c420: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
c430: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
c440: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
c450: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
c460: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
c470: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
c480: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
c490: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
c4a0: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
c4b0: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
c4c0: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
c4d0: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
c4e0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
c4f0: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
c500: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
c510: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
c520: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
c530: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
c540: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
c550: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
c560: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
c570: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
c580: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
c590: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
c5a0: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
c5b0: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
c5c0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
c5d0: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
c5e0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
c5f0: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
c600: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
c610: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
c620: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
c630: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
c640: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
c650: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
c660: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
c670: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
c680: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
c690: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
c6a0: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
c6b0: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
c6c0: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
c6d0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
c6e0: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
c6f0: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
c700: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
c710: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
c720: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
c730: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
c740: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
c750: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
c760: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
c770: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
c780: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
c790: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
c7a0: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
c7b0: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
c7c0: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
c7d0: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
c7e0: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
c7f0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
c800: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
c810: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c820: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
c830: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c840: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
c850: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
c860: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
c870: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
c880: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
c890: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
c8a0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
c8b0: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
c8c0: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
c8d0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
c8e0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
c8f0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
c900: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
c910: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
c920: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
c930: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
c940: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
c950: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
c960: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
c970: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
c980: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
c990: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
c9a0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
c9b0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
c9c0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
c9d0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
c9e0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
c9f0: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
ca00: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
ca10: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
ca20: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
ca30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
ca40: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
ca50: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
ca60: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
ca70: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
ca80: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
caa0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
cab0: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
cac0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
cad0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cae0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
caf0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
cb00: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
cb10: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
cb20: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
cb30: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
cb40: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
cb50: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
cb60: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
cb70: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
cb80: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cb90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
cba0: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cbb0: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
cbc0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cbd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cbe0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cbf0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cc00: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cc10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cc20: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cc30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cc40: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cc50: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cc60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cc70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cc80: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cc90: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
cca0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
ccb0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
ccc0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
ccd0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
cce0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
ccf0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
cd00: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
cd10: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
cd20: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
cd30: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
cd40: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
cd50: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
cd60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
cd70: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
cd80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
cd90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
cda0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
cdb0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
cdc0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
cdd0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
cde0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
cdf0: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
ce00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ce10: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
ce20: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
ce30: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
ce40: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
ce50: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
ce60: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
ce70: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
ce80: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
ce90: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
cea0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
ceb0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
cec0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
ced0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
cee0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
cef0: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
cf00: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
cf10: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cf20: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
cf30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
cf40: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
cf50: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
cf60: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
cf70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cf80: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cf90: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
cfa0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
cfb0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
cfc0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
cfd0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
cfe0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
cff0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d000: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d010: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d020: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d030: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d040: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d050: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d060: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d070: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d080: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d090: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d0a0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d0b0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d0c0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d0d0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d0e0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d0f0: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d100: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d110: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d120: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d130: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d140: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d150: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d160: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d170: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d180: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d190: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d1a0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d1b0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d1c0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d1d0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d1e0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d1f0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d200: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d210: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d220: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d230: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d240: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d250: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
d260: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d270: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d280: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d290: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d2a0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d2b0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d2c0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d2d0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d2e0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d2f0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d300: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d310: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d320: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d330: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d340: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d350: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d360: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d370: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d380: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d390: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d3a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d3b0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d3c0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d3d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d3e0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d3f0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d400: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d410: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d420: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d430: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d440: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d450: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d460: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d470: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d480: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d490: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
d4a0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
d4b0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d4c0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d4d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
d4e0: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
d4f0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d500: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d510: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d520: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
d530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
d540: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
d550: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
d560: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
d570: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d580: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
d590: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d5a0: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
d5b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
d5c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
d5d0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
d5e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d5f0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d600: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
d610: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
d620: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
d630: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
d640: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
d650: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d660: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
d670: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
d680: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
d690: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
d6a0: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
d6b0: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
d6c0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
d6d0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
d6e0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
d6f0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
d700: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
d710: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
d720: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
d730: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
d740: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
d750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
d760: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
d770: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
d780: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
d790: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
d7a0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
d7b0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
d7c0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
d7d0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
d7e0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
d7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
d800: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d810: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
d820: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
d830: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
d840: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d850: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
d860: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
d870: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
d880: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
d890: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
d8a0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
d8b0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
d8c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d8d0: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
d8e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d8f0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d900: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
d910: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d920: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
d930: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d940: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d950: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d960: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d970: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d980: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d990: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
d9a0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d9b0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d9c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
d9d0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d9e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
d9f0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
da00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
da10: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
da20: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
da30: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
da40: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
da50: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
da60: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
da70: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
da80: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
da90: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
daa0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
dab0: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
dac0: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
dad0: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
dae0: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
daf0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
db00: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
db10: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
db20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
db30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
db40: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
db50: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
db60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
db70: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
db80: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
db90: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
dba0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
dbb0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
dbc0: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
dbd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
dbe0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
dbf0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
dc00: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dc10: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
dc20: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
dc30: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
dc40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
dc50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
dc60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
dc70: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
dc80: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
dc90: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
dca0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
dcb0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
dcc0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
dcd0: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
dce0: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
dcf0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
dd00: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
dd10: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
dd20: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
dd30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
dd40: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
dd50: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
dd60: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
dd70: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
dd80: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
dd90: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
dda0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
ddb0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
ddc0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
ddd0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
dde0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ddf0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
de00: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
de10: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
de20: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
de30: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
de40: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
de50: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
de60: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
de70: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
de80: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
de90: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
dea0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
deb0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
dec0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
ded0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
dee0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
def0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
df00: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
df10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
df20: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
df30: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
df40: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
df50: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
df60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
df70: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
df80: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
df90: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
dfa0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
dfb0: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
dfc0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
dfd0: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
dfe0: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
dff0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
e000: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
e010: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
e020: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
e030: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
e040: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
e050: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
e060: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
e070: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
e080: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
e090: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
e0a0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
e0b0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
e0c0: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
e0d0: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
e0e0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
e0f0: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
e100: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e110: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
e120: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
e130: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
e140: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e150: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e160: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e170: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e180: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
e190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
e1a0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e1b0: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
e1c0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
e1d0: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
e1e0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e1f0: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
e200: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
e210: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e220: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
e230: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
e240: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
e250: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
e260: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
e270: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e280: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e290: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
e2a0: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
e2b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e2c0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
e2d0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
e2e0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
e2f0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
e300: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
e310: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
e320: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
e330: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e340: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e350: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
e360: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
e370: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
e380: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
e390: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
e3a0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
e3b0: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
e3c0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
e3d0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
e3e0: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
e3f0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
e400: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e410: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
e420: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
e430: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
e440: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
e450: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
e460: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
e470: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
e480: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
e490: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
e4a0: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
e4b0: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
e4c0: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
e4d0: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
e4e0: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
e4f0: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
e500: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
e510: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
e520: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
e530: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
e540: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
e550: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
e560: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
e570: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
e580: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
e590: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
e5a0: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
e5b0: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
e5c0: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
e5d0: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
e5e0: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
e5f0: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
e600: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
e610: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
e620: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
e630: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
e640: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
e650: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
e660: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
e670: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
e680: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
e690: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
e6a0: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
e6b0: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
e6c0: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
e6d0: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
e6e0: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
e6f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
e700: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
e710: 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65  LOCK ){..#if !de
e720: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
e730: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
e740: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
e750: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
e760: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
e770: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
e780: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
e790: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
e7a0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
e7b0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
e7c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
e7d0: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
e7e0: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
e7f0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e810: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
e820: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
e830: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
e840: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
e850: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
e860: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
e870: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e880: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
e890: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
e8a0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
e8b0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e8c0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
e8d0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
e8e0: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
e8f0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
e900: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e910: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
e920: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
e930: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
e940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e950: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
e960: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
e970: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
e980: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e990: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e9a0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
e9b0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
e9c0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
e9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
e9e0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
e9f0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
ea00: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ea10: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
ea20: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ea30: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
ea40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ea50: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
ea60: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ea70: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ea80: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ea90: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
eaa0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
eab0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
eac0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ead0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
eae0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
eaf0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
eb00: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
eb10: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
eb20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
eb30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
eb40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
eb50: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
eb60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
eb70: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
eb80: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
eb90: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
eba0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
ebb0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ebc0: 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
ebd0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
ebe0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ebf0: 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
ec00: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
ec10: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ec20: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
ec30: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
ec40: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
ec50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ec60: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
ec70: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ec80: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ec90: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
eca0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ecb0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
ecc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
ecd0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ece0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ecf0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
ed00: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
ed10: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
ed20: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
ed30: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
ed40: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ed50: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
ed60: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ed70: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
ed80: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ed90: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
eda0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
edb0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
edc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
edd0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ede0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
edf0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
ee00: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
ee10: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
ee20: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
ee30: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
ee40: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
ee50: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
ee60: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
ee70: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
ee80: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
ee90: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
eea0: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
eeb0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
eec0: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
eed0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
eee0: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
eef0: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
ef00: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ef10: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
ef20: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
ef30: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
ef40: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
ef50: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
ef60: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
ef70: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
ef80: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
ef90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
efa0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
efb0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  CK;.          pF
efc0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
efd0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
efe0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
eff0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f000: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
f010: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f020: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
f030: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f040: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
f050: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
f060: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
f070: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
f080: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
f090: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
f0a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
f0b0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f0c0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
f0d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
f0e0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
f0f0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f100: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f110: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f120: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f130: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f140: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f150: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f160: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f170: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f180: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f190: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f1a0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f1b0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f1c0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f1d0: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f1e0: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f1f0: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f200: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f210: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f220: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f230: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f240: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f260: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f270: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f280: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f290: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f2a0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f2b0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f2c0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f2d0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f2f0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f300: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f320: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f330: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f340: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f350: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f360: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f370: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f380: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f390: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f3a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f3b0: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f3c0: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f3d0: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f3e0: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f3f0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f400: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f410: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f420: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f430: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f440: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f450: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
f460: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f470: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f480: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
f490: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f4a0: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
f4b0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
f4c0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
f4d0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
f4e0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
f4f0: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
f500: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f510: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f520: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
f530: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f540: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
f550: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f560: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f570: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f580: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
f590: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
f5a0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
f5b0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
f5c0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
f5d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
f5e0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
f5f0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f600: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
f610: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
f620: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
f630: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
f640: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f650: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
f660: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
f670: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f680: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
f690: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
f6a0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
f6b0: 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
f6c0: 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
f6d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73   );.  return pos
f6e0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
f6f0: 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 73  leLock, 0);.}..s
f700: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
f710: 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
f720: 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
f730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
f740: 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
f750: 69 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f 2a 0a 2a  ile *pFd);../*.*
f760: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f770: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
f780: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
f790: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
f7a0: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
f7b0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
f7c0: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
f7d0: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
f7e0: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
f7f0: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
f800: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
f810: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
f820: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
f830: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
f840: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
f850: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
f860: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
f870: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f880: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
f890: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
f8a0: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
f8b0: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
f8c0: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
f8d0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
f8e0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
f8f0: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
f900: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
f910: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
f920: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f930: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
f940: 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
f950: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
f960: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
f970: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
f980: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
f990: 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
f9a0: 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
f9b0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
f9c0: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
f9d0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74     if( pFile->ct
f9e0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
f9f0: 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
fa00: 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
fa10: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
fa20: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
fa30: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
fa40: 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
fa50: 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
fa60: 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
fa70: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
fa80: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
fa90: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
faa0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
fab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fac0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
fad0: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
fae0: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
faf0: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
fb00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fb10: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
fb20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
fb30: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
fb40: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
fb50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fb60: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fb70: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
fb80: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  *)id;.  unixUnlo
fb90: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
fba0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
fbb0: 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
fbc0: 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
fbd0: 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
fbe0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
fbf0: 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
fc00: 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
fc10: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
fc20: 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
fc30: 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
fc40: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
fc50: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
fc60: 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
fc70: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
fc80: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
fc90: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
fca0: 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
fcb0: 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
fcc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
fcd0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
fce0: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
fcf0: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
fd00: 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
fd10: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
fd20: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
fd30: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
fd40: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
fd50: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
fd60: 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
fd70: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
fd80: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
fd90: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
fda0: 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
fdb0: 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
fdc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
fdd0: 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
fde0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
fdf0: 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
fe00: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
fe10: 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
fe20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
fe30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fe40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
fe50: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
fe60: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
fe70: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fe90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
ff50: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
ff80: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
ff90: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
ffa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
ffb0: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
ffc0: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
ffd0: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
ffe0: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
fff0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
10000 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
10010 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
10020 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10030 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
10040 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
10050 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10060 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
10070 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
10080 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
10090 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
100a0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
100b0 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
100c0 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
100d0 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
100e0 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
100f0 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
10100 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
10110 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
10120 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
10130 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
10140 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
10150 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
10160 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
10170 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
10180 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
10190 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
101a0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
101b0 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
101c0 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
101d0 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
101e0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
101f0 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
10200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10210 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
10220 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
10230 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
10240 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
10250 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
10260 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
10270 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10280 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
10290 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
102a0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
102b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
102c0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
102d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
102e0 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
102f0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
10300 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
10310 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
10320 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
10330 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
10340 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
10350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10360 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10370 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
10380 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
10390 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
103a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
103b0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
103c0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
103d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
103e0 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
103f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10400 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
10410 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
10420 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
10430 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
10440 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10450 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10460 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
10470 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
104e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
10550 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
10560 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10580 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
10590 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
105a0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
105b0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
105c0 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
105d0 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
105e0 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
105f0 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
10600 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10610 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
10620 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
10630 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
10640 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
10650 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
10660 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
10670 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
10680 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
10690 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
106a0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
106b0 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
106c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
106d0 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
106e0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
106f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
10700 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
10710 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
10720 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
10730 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
10740 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
10750 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
10760 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
10770 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
10780 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
10790 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
107a0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
107b0 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
107c0 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
107d0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
107e0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
107f0 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
10800 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
10810 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
10820 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
10830 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
10840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
10850 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
10860 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
10870 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
10880 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
10890 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
108a0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
108b0 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
108c0 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
108d0 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
108e0 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
108f0 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
10900 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
10910 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
10920 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
10930 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
10940 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
10950 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
10960 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
10970 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
10980 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
10990 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
109a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
109b0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
109c0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
109d0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
109e0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
109f0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
10a00 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
10a10 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
10a20 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
10a30 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
10a40 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
10a50 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
10a60 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
10a70 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
10a80 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
10a90 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
10aa0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
10ab0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
10ac0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
10ad0 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
10ae0 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
10af0 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
10b00 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
10b10 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
10b20 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
10b30 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
10b40 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
10b50 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
10b60 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
10b70 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
10b80 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
10b90 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
10ba0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
10bb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
10bc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10bd0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
10be0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10bf0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
10c00 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
10c10 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10c20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
10c30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
10c40 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
10c50 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
10c60 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
10c70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10c80 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
10c90 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
10ca0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
10cb0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
10cc0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10cd0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
10ce0 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
10cf0 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
10d00 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
10d10 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
10d20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
10d30 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
10d40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
10d50 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
10d60 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
10d70 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
10d80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10d90 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
10da0 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
10db0 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
10dc0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
10dd0 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
10de0 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
10df0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10e00 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
10e10 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
10e20 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d  (zLockFile, 0)==
10e30 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  0;.  }.  OSTRACE
10e40 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
10e50 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
10e60 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
10e70 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
10e80 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
10e90 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
10ea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10eb0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
10ec0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
10ed0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
10ee0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
10ef0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
10f00 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
10f10 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
10f20 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
10f30 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
10f40 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
10f50 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
10f60 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
10f70 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
10f80 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
10f90 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
10fa0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
10fb0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
10fc0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
10fd0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
10fe0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
10ff0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
11000 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
11010 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
11020 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
11030 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
11040 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
11050 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
11060 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
11070 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
11080 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
11090 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
110a0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
110b0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
110c0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
110d0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
110e0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
110f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
11100 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11110 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
11120 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
11130 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
11140 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
11150 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
11160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
11170 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
11180 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
11190 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
111a0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
111b0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
111c0 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57  g level..**.** W
111d0 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  ith dotfile lock
111e0 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f  ing, we really o
111f0 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74  nly support stat
11200 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45  e (4): EXCLUSIVE
11210 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63  ..** But we trac
11220 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b  k the other lock
11230 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72  ing levels inter
11240 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nally..*/.static
11250 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
11260 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11270 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11280 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11290 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
112a0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
112b0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
112c0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
112d0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
112e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
112f0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
11300 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
11310 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
11320 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
11330 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
11340 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
11350 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
11360 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
11370 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
11380 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11390 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
113a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
113b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
113c0 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
113d0 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
113e0 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
113f0 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
11400 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
11410 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
11420 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
11430 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
11440 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
11450 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11460 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11470 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11480 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  sive lock */.  r
11490 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63  c = osMkdir(zLoc
114a0 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20  kFile, 0777);.  
114b0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
114c0 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
114d0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63  n/create the loc
114e0 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  k directory */. 
114f0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11500 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
11510 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
11520 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11530 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
11540 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
11550 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11560 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
11570 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
11580 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
11590 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
115a0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
115b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
115c0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
115d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
115e0 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
115f0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11600 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11610 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
11620 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
11630 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
11640 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11650 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11660 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11670 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11680 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11690 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
116a0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
116b0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
116c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
116d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
116e0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
116f0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11700 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11710 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
11720 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
11730 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11740 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
11750 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
11760 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
11770 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
11780 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
11790 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
117a0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
117b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
117c0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
117d0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
117e0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
117f0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11800 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11810 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11820 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
11830 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11840 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
11850 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11860 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
11870 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11880 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
11890 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
118a0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
118b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
118c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
118d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
118e0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
118f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11900 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
11910 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
11920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11930 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
11940 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
11950 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
11960 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
11970 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
11980 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
11990 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
119a0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
119b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
119c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
119d0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
119e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
119f0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
11a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11a10 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
11a20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
11a30 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
11a40 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
11a50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
11a60 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
11a70 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
11a80 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
11a90 69 66 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  if( rc<0 && errn
11aa0 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20  o==ENOTDIR ) rc 
11ab0 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b  = osUnlink(zLock
11ac0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
11ad0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  0 ){.    int tEr
11ae0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11af0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28   rc = 0;.    if(
11b00 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
11b10 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11b20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
11b30 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  OCK;.    }.    i
11b40 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11b50 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11b60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11b70 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11b80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
11b90 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
11ba0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
11bb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11bc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
11bd0 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b  ose a file.  Mak
11be0 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20  e sure the lock 
11bf0 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65  has been release
11c00 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  d before closing
11c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11c20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  dotlockClose(sql
11c30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
11c40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11c50 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
11c60 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
11c70 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11c80 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
11c90 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
11ca0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
11cb0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11cc0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
11cd0 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
11ce0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
11cf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11d00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11d10 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64  *** End of the d
11d20 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70  ot-file lock imp
11d30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11da0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
11e10 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20  n flock Locking 
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e40 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  .**.** Use the f
11e50 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61  lock() system ca
11e60 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f  ll to do file lo
11e70 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f  cking..**.** flo
11e80 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20  ck() locking is 
11e90 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f  like dot-file lo
11ea0 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68  cking in that th
11eb0 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e  e various.** fin
11ec0 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20  e-grain locking 
11ed0 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64  levels supported
11ee0 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63   by SQLite are c
11ef0 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a  ollapsed into.**
11f00 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73   a single exclus
11f10 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74  ive lock.  In ot
11f20 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45  her words, SHARE
11f30 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64  D, RESERVED, and
11f40 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  .** PENDING lock
11f50 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74  s are the same t
11f60 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55  hing as an EXCLU
11f70 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69  SIVE lock.  SQLi
11f80 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b  te.** still work
11f90 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68  s when you do th
11fa0 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65  is, but concurre
11fb0 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73  ncy is reduced s
11fc0 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73  ince.** only a s
11fd0 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
11fe0 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  n be reading the
11ff0 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74   database at a t
12000 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20  ime..**.** Omit 
12010 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20  this section if 
12020 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
12030 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74  CKING_STYLE is t
12040 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a  urned off or if.
12050 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72  ** compiling for
12060 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66   VXWORKS..*/.#if
12070 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
12080 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
12090 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a  !OS_VXWORKS../*.
120a0 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29  ** Retry flock()
120b0 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
120c0 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23   with EINTR.*/.#
120d0 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74  ifdef EINTR.stat
120e0 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c  ic int robust_fl
120f0 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ock(int fd, int 
12100 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  op){.  int rc;. 
12110 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28   do{ rc = flock(
12120 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20  fd,op); }while( 
12130 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
12140 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
12150 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
12160 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f  efine robust_flo
12170 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c  ck(a,b) flock(a,
12180 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a  b).#endif.     .
12190 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
121a0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
121b0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
121c0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
121d0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
121e0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
121f0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12200 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12210 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12220 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12230 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12240 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12250 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12260 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12270 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12280 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12290 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
122a0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
122b0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
122c0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
122d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
122e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
122f0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12300 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12310 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
12320 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
12330 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12340 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12350 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
12360 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12370 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12380 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12390 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
123a0 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
123b0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
123c0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
123d0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
123e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
123f0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
12400 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
12410 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
12420 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
12430 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
12440 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
12450 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
12460 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
12470 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
12480 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
12490 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75    int lrc = robu
124a0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
124b0 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
124c0 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21  K_NB);.    if( !
124d0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
124e0 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e  got the lock, un
124f0 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20  lock it */.     
12500 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
12510 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12520 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66  CK_UN);.      if
12530 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20   ( lrc ) {.     
12540 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12550 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f  errno;.        /
12560 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20  * unlock failed 
12570 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f  with an error */
12580 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53  .        lrc = S
12590 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
125a0 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  CK; .        if(
125b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
125c0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
125d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
125e0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
125f0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
12600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12610 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
12620 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12630 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
12640 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
12650 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
12660 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
12670 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
12680 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
12690 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
126a0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
126b0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
126c0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
126d0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
126e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
126f0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12700 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
12710 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
12720 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
12730 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
12740 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
12750 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12760 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
12770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
12780 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12790 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
127a0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
127b0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
127c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
127d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
127e0 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
127f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
12800 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12810 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
12820 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
12830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12840 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12850 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12860 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
12870 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
12880 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
12890 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
128a0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
128b0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
128c0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
128d0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
128e0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
128f0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
12900 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
12910 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
12920 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
12930 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
12940 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
12950 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
12960 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
12970 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
12980 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
12990 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
129a0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
129b0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
129c0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
129d0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
129e0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
129f0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
12a00 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
12a10 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
12a20 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
12a30 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
12a40 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
12a50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
12a60 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
12a70 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
12a80 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
12a90 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
12aa0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12ab0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
12ac0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
12ad0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
12ae0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
12af0 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
12b00 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
12b10 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
12b20 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
12b30 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
12b40 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
12b50 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
12b60 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
12b70 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
12b80 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
12b90 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
12ba0 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
12bb0 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
12bc0 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
12bd0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
12be0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12bf0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
12c00 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
12c10 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
12c20 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
12c30 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
12c40 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
12c50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12c60 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
12c70 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12c80 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
12c90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12ca0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12cb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12cc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
12cd0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  le );..  /* if w
12ce0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
12cf0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
12d00 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
12d10 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
12d20 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
12d30 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
12d40 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
12d50 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
12d60 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12d70 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12d80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12d90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12da0 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
12db0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
12dc0 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c  .  if (robust_fl
12dd0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12de0 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
12df0 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  ) {.    int tErr
12e00 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12e10 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  /* didn't get, m
12e20 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20  ust be busy */. 
12e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12e40 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12e50 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12e60 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
12e70 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12e80 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
12e90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12ea0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
12eb0 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
12ec0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
12ed0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
12ee0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
12ef0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12f00 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
12f10 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
12f20 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
12f30 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
12f40 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
12f50 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
12f60 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
12f70 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
12f80 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
12f90 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12fa0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
12fb0 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
12fc0 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
12fd0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
12ff0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
13000 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13010 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13020 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
13030 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
13040 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13050 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
13060 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
13070 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
13080 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
13090 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
130a0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
130b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
130c0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
130d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
130e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
130f0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
13100 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
13110 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
13120 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
13130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13140 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
13150 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13160 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
13170 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13180 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
13190 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
131a0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
131b0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
131c0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
131d0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
131e0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
131f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
13200 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
13210 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
13220 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
13230 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
13240 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
13250 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
13260 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13270 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
13280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13290 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
132a0 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
132b0 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
132c0 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
132d0 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
132e0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
132f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
13300 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13310 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13320 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13330 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13340 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
13350 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20  nlock. */.  if( 
13360 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
13370 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20  le->h, LOCK_UN) 
13380 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
13390 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
133a0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65  CK_ERRORS.    re
133b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
133d0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
133e0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
133f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13400 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d  OERR_UNLOCK;.  }
13410 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
13420 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
13430 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
13440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13450 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
13460 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
13470 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
13480 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13490 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
134a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
134b0 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
134c0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
134d0 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  K);.    rc = clo
134e0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
134f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13500 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
13510 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
13520 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
13530 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a  _VXWORK */../***
13540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13550 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63   End of the floc
13560 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  k lock implement
13570 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
13580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13640 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65  ***** Begin Name
13650 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b  d Semaphore Lock
13660 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
13670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
13680 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
13690 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
136a0 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
136b0 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53  VxWorks..**.** S
136c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
136d0 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63   is like dot-loc
136e0 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74  k and flock in t
136f0 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e  hat it really on
13700 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45  ly.** supports E
13710 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
13720 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
13730 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61   process can rea
13740 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68  d or write.** th
13750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13760 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
13770 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69   reduces potenti
13780 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20  al concurrency, 
13790 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  but.** makes the
137a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
137b0 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72  tion much easier
137c0 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ..*/.#if OS_VXWO
137d0 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
137e0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
137f0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
13800 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
13810 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
13820 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
13830 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
13840 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
13850 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
13860 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
13870 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
13880 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
13890 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
138a0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
138b0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
138c0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
138d0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
138e0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
138f0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
13900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13910 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
13920 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13930 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
13940 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
13950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
13960 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
13970 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13980 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13990 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
139a0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
139b0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
139c0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
139d0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
139e0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
139f0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
13a00 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
13a10 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
13a20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13a30 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
13a40 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
13a50 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
13a60 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
13a70 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
13a80 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
13a90 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
13aa0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
13ab0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
13ac0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
13ad0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
13ae0 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20  t statBuf;..    
13af0 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
13b00 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
13b10 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13b20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
13b30 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
13b40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
13b50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13b60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13b70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13b80 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13b90 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69  CK);.        pFi
13ba0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13bb0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20  tErrno;.      } 
13bc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
13bd0 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
13be0 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
13bf0 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
13c00 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
13c10 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
13c20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41  >eFileLock < SHA
13c30 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
13c40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13c50 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
13c60 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
13c70 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
13c80 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
13c90 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
13ca0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
13cb0 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29  K %d %d %d (sem)
13cc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
13cd0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
13ce0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13cf0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13d10 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13d20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13d30 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13d40 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13d50 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13d60 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13d70 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13d80 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
13d90 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13da0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
13db0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
13dc0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
13dd0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
13de0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
13df0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
13e00 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
13e10 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
13e20 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
13e30 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
13e40 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
13e50 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
13e60 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
13e70 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
13e80 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
13e90 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
13ea0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
13eb0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
13ec0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
13ed0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
13ee0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
13ef0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
13f00 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13f10 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13f20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13f30 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13f40 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13f50 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13f60 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13f70 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13f80 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
13f90 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
13fa0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
13fb0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
13fc0 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
13fd0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
13fe0 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
13ff0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
14000 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
14010 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
14020 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
14030 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
14040 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
14050 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
14060 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
14070 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
14080 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
14090 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
140a0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
140b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
140c0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
140d0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
140e0 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
140f0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
14100 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
14110 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
14120 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
14130 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14140 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14150 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14160 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14170 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
14180 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
14190 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
141a0 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
141b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
141c0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
141d0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
141e0 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
141f0 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
14200 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
14210 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
14220 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
14230 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
14240 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
14250 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14260 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
14270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14280 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14290 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
142a0 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
142b0 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
142c0 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
142d0 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
142e0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
142f0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
14300 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14310 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14320 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
14330 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
14340 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
14350 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
14360 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14370 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
14380 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
14390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
143a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
143b0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
143c0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
143d0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
143e0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
143f0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
14400 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
14410 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
14420 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
14430 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14440 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14450 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
14460 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
14470 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
14480 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
144a0 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  emUnlock(sqlite3
144b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
144c0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
144d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
144e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
144f0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
14500 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
14510 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
14520 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
14530 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
14540 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
14550 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
14560 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
14570 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
14580 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
14590 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
145a0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
145b0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
145c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
145d0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
145e0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
145f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14600 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
14610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14620 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
14630 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
14640 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
14650 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
14660 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
14670 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
14680 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
14690 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
146a0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
146b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
146c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
146d0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
146e0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
146f0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
14700 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
14710 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
14720 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
14730 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14740 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
14750 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14760 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
14770 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
14780 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14790 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
147a0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
147b0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
147c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
147d0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
147e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
147f0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
14800 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
14810 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
14820 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
14830 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
14840 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
14850 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14860 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
14870 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
14880 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14890 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
148a0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
148b0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
148c0 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
148d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
148e0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
148f0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
14900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14910 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
14920 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
14930 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
14940 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
14950 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
14960 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
14970 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
14980 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
14990 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
149a0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
149b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
14a80 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
14a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14aa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
14ab0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
14ac0 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
14ad0 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
14ae0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
14af0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
14b00 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
14b10 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
14b20 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
14b30 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
14b40 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
14b50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
14b60 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
14b70 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
14b80 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
14b90 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
14ba0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
14bb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
14bc0 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
14bd0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14be0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
14bf0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
14c00 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
14c10 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
14c20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14c30 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
14c40 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
14c50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
14c60 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
14c70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
14c80 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
14c90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
14ca0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
14cb0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
14cc0 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
14cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14ce0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
14cf0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
14d00 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
14d10 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
14d20 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
14d30 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
14d40 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
14d50 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
14d60 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
14d70 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
14d80 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
14d90 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
14da0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14db0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
14dc0 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
14dd0 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
14de0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
14df0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
14e00 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
14e10 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
14e20 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
14e30 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
14e60 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
14e70 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
14e80 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
14e90 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
14ea0 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
14eb0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
14ec0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
14ed0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
14ee0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
14ef0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
14f00 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
14f10 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
14f20 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
14f30 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
14f40 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
14f50 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
14f60 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
14f70 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
14f80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
14f90 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
14fa0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
14fb0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
14fc0 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
14fd0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
14fe0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
14ff0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
15000 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
15010 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
15020 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
15030 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
15040 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
15050 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
15060 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
15070 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
15080 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
15090 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
150a0 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
150b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
150c0 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
150d0 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
150e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
150f0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
15100 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
15110 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
15120 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
15130 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
15140 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
15150 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
15160 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
15170 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
15180 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
15190 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
151a0 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
151b0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
151c0 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
151d0 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
151e0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
151f0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
15200 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
15210 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
15220 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
15230 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
15240 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
15250 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
15260 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
15270 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
15280 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
15290 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
152a0 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
152b0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
152c0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
152d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
152e0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
152f0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
15300 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
15310 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15320 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
15330 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
15340 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
15350 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
15360 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
15390 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
153a0 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
153b0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
153c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
153d0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
153e0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
153f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
15400 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
15410 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
15420 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
15430 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
15440 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
15450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
15460 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15470 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
15480 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
15490 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
154a0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
154b0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
154c0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
154d0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
154e0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
154f0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
15500 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
15510 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
15520 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
15530 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
15540 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
15550 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
15560 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
15570 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
15580 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
15590 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
155a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
155b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
155c0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
155d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
155e0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
155f0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
15600 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15610 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
15620 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15630 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20   *context;.  .  
15640 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15660 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
15670 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
15680 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15690 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  .  context = (af
156a0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
156b0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
156c0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
156d0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
156e0 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
156f0 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
15700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15710 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
15720 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
15730 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
15740 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
15750 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
15760 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
15770 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
15780 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
15790 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
157a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
157b0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
157c0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
157d0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
157e0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
157f0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
15800 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
15810 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
15820 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15830 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
15840 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
15850 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
15860 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15870 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
15880 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
15890 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
158a0 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
158b0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
158c0 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
158d0 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
158e0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
158f0 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
15900 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
15910 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
15920 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
15930 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15940 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
15950 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
15960 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15970 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
15980 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
15990 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
159a0 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
159b0 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
159c0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
159d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
159e0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
159f0 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
15a00 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
15a10 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
15a20 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
15a30 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
15a40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
15a50 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
15a60 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
15a70 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
15a80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15a90 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
15aa0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
15ab0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
15ac0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
15ad0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
15ae0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
15af0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
15b00 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
15b10 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
15b20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
15b30 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
15b40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
15b50 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
15b60 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
15b70 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
15b80 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
15b90 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
15ba0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
15bb0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
15bc0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
15bd0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
15be0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
15bf0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
15c00 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
15c10 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
15c20 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
15c30 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
15c40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15c50 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
15c60 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
15c70 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
15c80 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
15c90 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
15ca0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
15cb0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
15cc0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
15cd0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15ce0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15cf0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
15d00 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
15d10 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15d20 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
15d30 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
15d40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15d50 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
15d60 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
15d70 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
15d80 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
15d90 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
15da0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
15db0 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
15dc0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15dd0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
15de0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15df0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
15e00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15e10 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
15e20 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
15e30 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
15e40 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
15e50 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
15e60 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15e70 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15e80 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15e90 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15ea0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
15eb0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
15ec0 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
15ed0 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
15ee0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
15ef0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
15f00 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
15f10 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
15f20 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
15f30 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
15f40 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15f50 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
15f60 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
15f70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
15f80 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
15f90 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
15fa0 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
15fb0 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
15fc0 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
15fd0 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
15fe0 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
15ff0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
16000 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
16010 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
16020 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
16030 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16040 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
16050 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
16060 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16070 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
16080 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
16090 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
160a0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
160b0 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
160c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
160d0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
160e0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
160f0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
16100 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
16110 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
16120 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
16130 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
16140 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
16150 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
16160 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
16170 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
16180 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
16190 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
161a0 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
161b0 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
161c0 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
161d0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
161e0 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
161f0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
16200 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
16210 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
16220 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
16230 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
16240 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
16250 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
16260 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
16270 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16280 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
16290 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
162a0 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
162b0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
162c0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
162d0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
162e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
162f0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
16300 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
16310 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
16320 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
16330 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
16340 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
16350 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
16360 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
16370 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
16380 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
16390 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
163a0 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
163b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
163c0 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
163d0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
163e0 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
163f0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
16400 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
16410 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16420 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
16430 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
16440 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
16450 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
16460 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
16470 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16480 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
16490 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
164a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
164b0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
164c0 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
164d0 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
164e0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
164f0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
16500 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
16510 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
16520 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16530 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
16540 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
16550 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
16560 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16570 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
16590 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
165a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
165b0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
165c0 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
165d0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
165e0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
165f0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
16600 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
16610 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
16620 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
16630 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
16640 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
16650 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
16660 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
16670 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
16680 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
16690 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
166a0 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
166b0 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
166c0 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
166d0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
166e0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
166f0 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
16700 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
16710 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16720 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
16730 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
16740 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
16750 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
16760 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
16770 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16780 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
16790 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
167a0 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
167b0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
167c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
167d0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
167e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
167f0 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
16800 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
16810 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
16820 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
16830 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
16840 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
16850 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
16860 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16870 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16880 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
16890 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
168a0 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
168b0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
168d0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
168e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
168f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
16900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
16910 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
16920 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
16930 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
16940 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
16950 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
16960 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
16970 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
16980 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
16990 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
169a0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
169b0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
169c0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
169d0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
169e0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
169f0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
16a00 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
16a10 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
16a20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16a30 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
16a40 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
16a50 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
16a60 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
16a70 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16a80 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
16a90 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
16aa0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
16ab0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
16ac0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
16ad0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
16ae0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
16af0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16b00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16b10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
16b20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
16b30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
16b40 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
16b50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16b60 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
16b70 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
16b80 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16b90 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
16ba0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16bb0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
16bc0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
16bd0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16be0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
16bf0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
16c00 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
16c10 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
16c20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
16c30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16c40 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16c50 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
16c60 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
16c70 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
16c80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16c90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
16ca0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
16cb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
16cc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
16cd0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
16ce0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
16cf0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
16d00 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
16d10 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
16d20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
16d30 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
16d40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
16d50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
16d60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
16d70 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
16d80 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
16d90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
16da0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
16db0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
16dc0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
16dd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
16de0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
16df0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
16e00 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
16e10 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
16e20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
16e30 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
16e40 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
16e50 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
16e60 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
16e70 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
16e80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
16e90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
16ea0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
16eb0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16ec0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16ed0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
16ee0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
16ef0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
16f00 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
16f10 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
16f20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16f30 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
16f40 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
16f50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
16f60 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
16f70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16f80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
16f90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
16fa0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
16fb0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
16fc0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
16fd0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
16fe0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16ff0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
17000 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
17010 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
17020 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
17030 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17040 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17050 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17060 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
17090 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
170a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
170b0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
170c0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
170d0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
170e0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
170f0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
17100 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
17110 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17120 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17130 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
17170 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
17180 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
17190 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
171a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
171b0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
171d0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
171e0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
171f0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
17200 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
17210 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17220 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
17230 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
17240 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
17250 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
17260 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
17270 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
17280 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
17290 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
172a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
172b0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
172c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
172d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
172e0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
172f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
17300 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
17310 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
17320 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
17330 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
17340 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
17350 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
17360 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
17370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17380 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17390 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
173a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
173b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
173c0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
173d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
173e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
173f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17400 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17410 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
17420 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
17430 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
17440 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
17450 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17460 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
17470 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
17480 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17490 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
174a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
174b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
174c0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
174d0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
174e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
174f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
17500 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
17510 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
17520 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
17530 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
17540 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
17550 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
17560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
17570 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
17580 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17590 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
175a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
175b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
175c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
175d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
175e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
175f0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
17600 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17610 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
17620 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17630 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
17640 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
17650 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
17660 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
17670 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17680 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
17690 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
176a0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
176b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
176c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
176d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
176e0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
176f0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
17700 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
17710 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
17720 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
17730 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
17740 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
17750 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
17760 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17770 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
17780 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
17790 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
177a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
177b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
177c0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
177d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
177e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
177f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17800 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
17810 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17820 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
17830 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
17840 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
17850 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
17860 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
17870 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
17880 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
17890 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
178a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
178b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
178c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
178d0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
178e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
178f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17900 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
17910 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17920 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
17930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17940 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
17950 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
17960 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
17970 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
17980 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
17990 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
179a0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
179b0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
179c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
179d0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
179e0 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
179f0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
17a00 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
17a10 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
17a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
17a30 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
17a40 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
17a50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
17a60 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
17a70 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
17a80 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
17a90 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
17aa0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
17ab0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
17ac0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
17ad0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
17ae0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
17af0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
17b00 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17b10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
17b20 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
17b30 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
17b40 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
17b50 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
17b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
17b70 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
17b80 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
17b90 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
17ba0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
17bb0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
17bc0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17bd0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
17be0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17bf0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17c00 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
17c10 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
17c20 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
17c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17c40 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
17c50 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
17c60 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
17c70 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
17c80 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
17c90 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
17ca0 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
17cb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
17cc0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
17cd0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
17ce0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
17cf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
17d00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17d10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17d20 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
17d30 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
17d40 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
17d50 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
17d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17d70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d80 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
17d90 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
17da0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
17db0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17dc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17dd0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
17de0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
17df0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
17e00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
17e10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
17e20 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
17e30 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
17e40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
17e50 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17e60 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17e70 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17e80 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
17e90 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
17ea0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
17eb0 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
17ec0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
17ed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17ee0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
17ef0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
17f00 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
17f10 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
17f20 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
17f30 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
17f40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17f50 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
17f60 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
17f70 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
17f80 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17f90 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
17fa0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
17fb0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
17fc0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
17fd0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
17fe0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
17ff0 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
18000 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
18010 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
18020 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
18030 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
18040 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
18050 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
18060 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18070 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
18080 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
18090 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
180a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
180b0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
180c0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
180d0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
180e0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
180f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
18100 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
18110 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
18120 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18130 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
18140 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
18150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18160 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
18170 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18180 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
18190 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
181a0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
181b0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
181c0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
181d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
181e0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
181f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18200 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
18210 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
18220 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
18230 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
18240 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
18250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18260 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
18270 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
18280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18290 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
182a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
182b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
182c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
182d0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
182e0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
182f0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
18300 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
18310 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18320 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
18330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18340 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
18350 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
18360 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
18370 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
18380 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
18390 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
183a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
183b0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
183c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
183d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
183e0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
183f0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
18400 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
18410 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
18420 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
18430 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
18440 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
18450 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
18460 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
18470 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
18480 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
18490 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
184a0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
184b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
184c0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
184d0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
184e0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
184f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
18500 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
18510 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
18520 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18530 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
18540 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
18550 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
18560 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
18570 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
18580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
18590 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
185a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
185b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
185c0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
185d0 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
185e0 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
185f0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18600 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
18610 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
18620 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
18630 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
18640 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
18650 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
18660 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
18670 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
18680 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
18690 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
186a0 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
186b0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
186c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
186d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
186e0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
186f0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
18720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18760 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
18770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
187c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
187d0 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
187e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
187f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18800 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
18810 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
18820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
18830 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
18840 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
18850 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
18860 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
18870 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
18880 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
18890 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
188a0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
188b0 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
188c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
188d0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
188e0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
188f0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
18900 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
18910 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
18920 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
18930 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
18940 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
18950 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18960 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
18970 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
18980 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
18990 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
189a0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
189b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
189c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
189d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
189e0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
189f0 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
18a00 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
18a10 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
18a20 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
18a30 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
18a40 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
18a50 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
18a60 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
18a70 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
18a80 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
18a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
18aa0 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
18ab0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18ac0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
18ad0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b20 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
18b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
18b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
18b90 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
18ba0 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
18bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
18bd0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
18be0 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
18bf0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
18c00 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
18c10 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
18c20 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
18c30 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
18c40 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
18c50 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
18c60 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
18c70 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
18c80 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
18c90 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
18ca0 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
18cb0 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
18cc0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
18cd0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
18ce0 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
18cf0 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
18d00 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
18d10 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
18d20 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
18d30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
18d40 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
18d50 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
18d60 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
18d70 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18d80 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
18d90 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
18da0 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
18db0 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
18dc0 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
18dd0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
18de0 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
18df0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
18e00 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
18e10 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
18e20 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
18e30 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
18e40 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
18e50 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
18e60 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
18e70 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
18e80 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
18e90 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
18ea0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
18eb0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
18ec0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
18ed0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
18ee0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
18ef0 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
18f00 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
18f10 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
18f20 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
18f40 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
18f50 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
18f60 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
18f70 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
18f80 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
18f90 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
18fa0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
18fb0 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
18fc0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18fd0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
18fe0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18ff0 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72  R_START;.  asser
19000 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
19010 66 66 66 66 29 20 29 3b 0a 20 20 63 6e 74 20 26  ffff) );.  cnt &
19020 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 64 6f 7b  = 0x1ffff;.  do{
19030 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
19040 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20  _PREAD).    got 
19050 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c  = osPread(id->h,
19060 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
19070 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
19080 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
19090 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
190a0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
190b0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
190c0 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
190d0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
190e0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
190f0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
19100 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66  .#else.    newOf
19110 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
19120 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
19130 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
19140 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
19150 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69  ffset-- );.    i
19160 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
19170 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  fset ){.      if
19180 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
19190 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75  1 ){.        ((u
191a0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
191b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
191c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
191d0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
191e0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
191f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19200 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19210 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19220 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19230 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19240 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19250 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19260 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19270 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19280 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19290 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
192a0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
192b0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
192c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
192d0 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rno;.      break
192e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
192f0 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63  got>0 ){.      c
19300 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20  nt -= got;.     
19310 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a   offset += got;.
19320 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67        prior += g
19330 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  ot;.      pBuf =
19340 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28   (void*)(got + (
19350 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20  char*)pBuf);.   
19360 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74   }.  }while( got
19370 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  >0 );.  TIMER_EN
19380 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  D;.  OSTRACE(("R
19390 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
193a0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20  %7lld %llu\n",. 
193b0 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68             id->h
193c0 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66  , got+prior, off
193d0 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52  set-prior, TIMER
193e0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
193f0 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a  turn got+prior;.
19400 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
19410 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
19420 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
19430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19440 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
19450 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
19460 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
19470 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
19480 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
19490 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
194a0 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
194b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
194c0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
194d0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
194e0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
194f0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
19500 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
19510 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
19520 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
19530 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
19540 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
19550 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
19560 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
19570 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
19580 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
19590 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
195a0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
195b0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
195c0 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
195d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
195e0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
195f0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
19600 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
19610 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
19620 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
19630 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
19640 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
19650 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
19660 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
19670 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
19680 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
19690 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
196a0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
196b0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
196c0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
196d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
196e0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
196f0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
19700 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
19710 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
19720 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
19730 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
19740 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
19750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
19770 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
19780 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
19790 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
197a0 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
197b0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
197c0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f  n))[offset], nCo
197d0 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
197e0 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
197f0 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
19800 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
19810 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
19820 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  y;.    }.  }..  
19830 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
19840 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  d(pFile, offset,
19850 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
19860 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
19870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19880 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
19890 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a   got<0 ){.    /*
198a0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
198b0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
198c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
198d0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
198e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
198f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  e->lastErrno = 0
19900 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
19910 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
19920 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
19930 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
19940 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
19950 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
19960 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
19970 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
19980 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19990 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
199a0 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
199b0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
199c0 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
199d0 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
199e0 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
199f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
19a00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19a10 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
19a20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
19a30 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
19a40 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
19a50 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
19a60 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
19a70 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
19a80 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
19a90 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
19aa0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
19ab0 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
19ac0 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
19ad0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
19ae0 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
19af0 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64  int got;.#if (!d
19b00 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19b10 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
19b20 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
19b30 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
19b40 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 63 6e  dif.  assert( cn
19b50 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29  t==(cnt&0x1ffff)
19b60 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31   );.  cnt &= 0x1
19b70 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54  ffff;.  TIMER_ST
19b80 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
19b90 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
19ba0 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
19bb0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19bc0 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
19bd0 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
19be0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
19bf0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19c00 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
19c10 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69  t = osPwrite64(i
19c20 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
19c30 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28   offset);}while(
19c40 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
19c50 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
19c60 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73   do{.    newOffs
19c70 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
19c80 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
19c90 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
19ca0 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
19cb0 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
19cc0 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
19cd0 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
19ce0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
19cf0 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  ){.        ((uni
19d00 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19d10 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19d30 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19d40 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19d50 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19d60 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
19d70 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57   }.    got = osW
19d80 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
19d90 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65  , cnt);.  }while
19da0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
19db0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
19dc0 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
19dd0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
19de0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
19df0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
19e00 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rrno;.  }..  OST
19e10 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
19e20 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
19e30 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
19e40 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
19e50 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
19e60 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
19e70 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
19e80 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
19e90 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
19ea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
19eb0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
19ec0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
19ed0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
19ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19ef0 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
19f00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
19f10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
19f20 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19f30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19f40 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
19f50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19f60 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
19f70 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
19f80 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
19f90 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
19fa0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19fb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19fc0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19fd0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19fe0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19ff0 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1a000 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1a010 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1a020 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1a030 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1a040 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1a050 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1a060 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1a070 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1a080 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1a090 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1a0a0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1a0b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a0c0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1a0d0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1a0e0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1a0f0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1a100 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1a110 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1a120 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1a130 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1a140 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1a150 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1a160 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1a170 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1a180 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1a190 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1a1a0 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1a1b0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1a1c0 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1a1d0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1a1e0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1a1f0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1a200 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1a210 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1a220 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a230 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1a240 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1a250 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1a260 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1a270 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1a280 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1a290 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1a2a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a2b0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1a2c0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1a2d0 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1a2e0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1a2f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a310 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1a320 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1a330 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1a340 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1a350 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1a360 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1a370 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1a380 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1a390 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1a3a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a3b0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1a3c0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1a3d0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
1a3e0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1a3f0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1a400 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1a410 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1a420 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1a430 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1a440 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1a450 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1a460 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1a470 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1a480 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1a490 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1a4a0 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1a4b0 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1a4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a4d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a4e0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1a4f0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1a500 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1a510 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1a520 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1a530 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
1a540 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1a550 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1a560 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1a570 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1a580 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1a590 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  opy;.    }.  }..
1a5a0 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
1a5b0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
1a5c0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1a5d0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1a5e0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
1a5f0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1a600 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1a610 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1a620 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1a630 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1a640 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1a650 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1a660 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1a670 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1a680 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1a690 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
1a6a0 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1a6b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1a6c0 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1a6d0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1a6e0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1a6f0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1a700 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1a710 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1a720 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1a730 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
1a740 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1a750 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
1a760 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1a770 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1a780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a790 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a7a0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
1a7b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1a7c0 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
1a7d0 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
1a7e0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1a7f0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
1a800 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
1a810 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
1a820 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
1a830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
1a840 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
1a850 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
1a860 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
1a870 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
1a880 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
1a890 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
1a8a0 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
1a8b0 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
1a8c0 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
1a8d0 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
1a8e0 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
1a8f0 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
1a900 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
1a910 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
1a920 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1a930 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1a940 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1a950 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1a960 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1a970 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1a980 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
1a990 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1a9a0 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1a9b0 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1a9c0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1a9d0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1a9e0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1a9f0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1aa00 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1aa10 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1aa20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1aa30 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1aa40 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1aa50 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1aa60 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1aa70 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1aa80 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1aa90 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1aaa0 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1aab0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1aac0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1aad0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
1aae0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
1aaf0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
1ab00 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
1ab10 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
1ab20 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
1ab30 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
1ab40 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
1ab50 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
1ab60 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
1ab70 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1ab80 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
1ab90 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
1aba0 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
1abb0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
1abc0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
1abd0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
1abe0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
1abf0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
1ac00 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
1ac10 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
1ac20 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1ac30 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
1ac40 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
1ac50 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1ac60 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
1ac70 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
1ac80 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
1ac90 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
1aca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1acb0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
1acc0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
1acd0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
1ace0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
1acf0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
1ad00 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
1ad10 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
1ad20 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
1ad30 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
1ad40 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
1ad50 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
1ad60 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
1ad70 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
1ad80 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
1ad90 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1ada0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
1adb0 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
1adc0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
1add0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
1ade0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1adf0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
1ae00 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
1ae10 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
1ae20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
1ae30 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
1ae40 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
1ae50 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
1ae60 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
1ae70 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
1ae80 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1ae90 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
1aea0 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
1aeb0 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
1aec0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
1aed0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
1aee0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
1aef0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
1af00 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
1af10 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
1af20 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
1af30 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
1af40 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
1af50 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
1af60 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
1af70 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
1af80 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
1af90 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
1afa0 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
1afb0 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
1afc0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
1afd0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
1afe0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
1aff0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
1b000 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
1b010 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1b020 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1b030 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
1b040 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
1b050 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
1b060 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
1b070 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
1b080 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
1b090 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
1b0a0 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
1b0b0 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
1b0c0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
1b0d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
1b0e0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
1b0f0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1b100 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1b110 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
1b120 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1b130 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1b140 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1b150 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
1b160 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
1b170 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1b180 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
1b190 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b1a0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1b1b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b1c0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
1b1d0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1b1e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1b1f0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1b200 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1b210 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1b220 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1b230 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1b240 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1b250 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1b260 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1b270 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1b280 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1b290 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b2a0 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1b2b0 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1b2c0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1b2d0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1b2e0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1b2f0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1b300 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1b310 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1b320 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1b330 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
1b340 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b350 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
1b360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
1b370 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1b380 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1b390 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
1b3a0 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
1b3b0 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
1b3c0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
1b3d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
1b3e0 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
1b3f0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
1b400 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
1b410 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
1b420 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
1b430 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
1b440 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
1b450 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
1b460 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
1b470 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
1b480 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
1b490 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
1b4a0 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
1b4b0 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
1b4c0 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
1b4d0 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
1b4e0 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
1b4f0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
1b500 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
1b510 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
1b520 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
1b530 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
1b540 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
1b550 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
1b560 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
1b570 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
1b580 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
1b590 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
1b5a0 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66  sync(fd);..#elif
1b5b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b5c0 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79  __).  /* fdatasy
1b5d0 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65  nc() on HFS+ doe
1b5e0 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74  sn't yet flush t
1b5f0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20  he file size if 
1b600 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65  it changed corre
1b610 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72  ctly.  ** so cur
1b620 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c  rently we defaul
1b630 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74  t to the macro t
1b640 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64  hat redefines fd
1b650 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63  atasync to fsync
1b660 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79  .  */.  rc = fsy
1b670 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20  nc(fd);.#else . 
1b680 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
1b690 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  fd);.#if OS_VXWO
1b6a0 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31  RKS.  if( rc==-1
1b6b0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53   && errno==ENOTS
1b6c0 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  UP ){.    rc = f
1b6d0 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
1b6e0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
1b6f0 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  KS */.#endif /* 
1b700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1b710 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
1b720 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
1b730 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( OS_VXWORKS &&
1b740 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
1b750 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
1b760 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b770 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1b780 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1b790 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1b7a0 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1b7b0 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1b7c0 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1b7d0 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1b7e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1b7f0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1b800 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1b810 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b820 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1b830 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1b840 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1b850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1b860 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1b870 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1b880 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72  e..**.** The dir
1b890 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1b8a0 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66  riptor is used f
1b8b0 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e  or only one thin
1b8c0 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28  g - to.** fsync(
1b8d0 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ) a directory to
1b8e0 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20   make sure file 
1b8f0 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c  creation and del
1b900 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20  etion events.** 
1b910 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64  are flushed to d
1b920 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63  isk.  Such fsync
1b930 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
1b940 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75   on newer.** jou
1b950 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74  rnaling filesyst
1b960 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71  ems, but are req
1b970 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66  uired on older f
1b980 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  ilesystems..**.*
1b990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1b9a0 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
1b9b0 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53   using the xSetS
1b9c0 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65  ysCall interface
1b9d0 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79  ..** The ability
1b9e0 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69   to override thi
1b9f0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64  s routine was ad
1ba00 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f  ded in support o
1ba10 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75  f the.** chromiu
1ba20 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e  m sandbox.  Open
1ba30 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
1ba40 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69  is a security ri
1ba50 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f  sk (we are.** to
1ba60 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74  ld) so making it
1ba70 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c   overrideable al
1ba80 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75  lows the chromiu
1ba90 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20  m sandbox to.** 
1baa0 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75  replace this rou
1bab0 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d  tine with a harm
1bac0 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20  less no-op.  To 
1bad0 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  make this routin
1bae0 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65  e.** a no-op, re
1baf0 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
1bb00 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e  stub that return
1bb10 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  s SQLITE_OK but 
1bb20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73  leaves.** *pFd s
1bb30 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65  et to a negative
1bb40 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   number..**.** I
1bb50 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1bb60 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
1bb70 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1bb80 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
1bb90 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
1bba0 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
1bbb0 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
1bbc0 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
1bbd0 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
1bbe0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
1bbf0 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
1bc00 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
1bc10 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
1bc20 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1bc30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1bc40 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1bc50 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
1bc60 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1bc70 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
1bc80 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
1bc90 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
1bca0 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
1bcb0 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
1bcc0 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
1bcd0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
1bce0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
1bcf0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1bd00 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1bd10 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
1bd20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1bd30 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
1bd40 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
1bd50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1bd60 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
1bd70 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
1bd80 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f  E_OK:unixLogErro
1bd90 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
1bda0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
1bdb0 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f  zDirname));.}../
1bdc0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
1bdd0 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
1bde0 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
1bdf0 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
1be00 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
1be10 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
1be20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
1be30 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
1be40 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
1be50 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
1be60 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
1be70 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
1be80 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
1be90 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
1bea0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
1beb0 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
1bec0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1bed0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1bee0 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
1bef0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
1bf00 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
1bf10 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1bf20 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1bf30 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
1bf40 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
1bf50 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
1bf60 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
1bf70 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
1bf80 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1bf90 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
1bfa0 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
1bfb0 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
1bfc0 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
1bfd0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1bfe0 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
1bff0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
1c000 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
1c010 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1c020 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1c030 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
1c040 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
1c050 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1c060 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
1c070 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
1c080 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
1c090 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
1c0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1c0b0 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
1c0c0 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
1c0d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
1c0e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1c0f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1c100 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
1c110 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
1c120 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
1c130 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
1c140 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
1c150 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1c160 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
1c170 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
1c180 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
1c190 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
1c1a0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
1c1b0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1c1c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
1c1d0 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1c1e0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1c1f0 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
1c200 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
1c210 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
1c220 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c230 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
1c240 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
1c250 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
1c260 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
1c270 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
1c280 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
1c290 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1c2a0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1c2b0 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
1c2c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1c2d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
1c2e0 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
1c2f0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
1c300 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
1c310 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
1c320 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
1c330 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1c340 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1c350 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1c360 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1c370 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1c380 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1c390 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1c3a0 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1c3b0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1c3c0 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1c3d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1c3e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1c3f0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1c400 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1c410 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1c420 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1c430 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1c440 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1c450 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1c460 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1c470 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1c480 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1c490 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1c4a0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1c4b0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1c4c0 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1c4d0 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1c4e0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1c4f0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1c500 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1c510 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1c520 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1c530 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1c540 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1c550 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1c560 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1c570 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1c580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c590 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29  OK && dirfd>=0 )
1c5a0 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79  {.      full_fsy
1c5b0 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b  nc(dirfd, 0, 0);
1c5c0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
1c5d0 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64  ose(pFile, dirfd
1c5e0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1c5f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c600 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
1c610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c620 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c630 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1c640 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
1c650 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72  DIRSYNC;.  }.  r
1c660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c670 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
1c680 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
1c690 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
1c6a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
1c6b0 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
1c6c0 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  file *id, i64 nB
1c6d0 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  yte){.  unixFile
1c6e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1c6f0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
1c700 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  rc;.  assert( pF
1c710 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
1c720 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1c730 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
1c740 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20  UNCATE );..  /* 
1c750 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
1c760 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
1c770 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
1c780 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
1c790 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
1c7a0 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
1c7b0 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
1c7c0 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
1c7d0 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
1c7e0 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
1c7f0 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
1c800 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
1c810 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1c820 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
1c830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1c840 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1c850 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
1c860 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
1c870 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
1c880 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1c890 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
1c8a0 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f  ..  rc = robust_
1c8b0 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1c8c0 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
1c8d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1c8e0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1c8f0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c900 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1c910 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1c920 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1c930 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1c940 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
1c950 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c960 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
1c970 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1c980 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1c990 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1c9a0 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
1c9b0 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1c9c0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1c9d0 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1c9e0 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1c9f0 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
1ca00 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1ca10 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
1ca20 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1ca30 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
1ca40 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
1ca50 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
1ca60 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1ca70 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1ca80 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
1ca90 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
1caa0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
1cab0 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
1cac0 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
1cad0 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
1cae0 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
1caf0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
1cb00 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
1cb10 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1cb20 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
1cb30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1cb40 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
1cb50 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65  as just truncate
1cb60 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
1cb70 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
1cb80 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61  rently.    ** ma
1cb90 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64  pped region, red
1cba0 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1cbb0 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61  e mapping size a
1cbc0 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77  s well. SQLite w
1cbd0 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72  ill.    ** use r
1cbe0 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28  ead() and write(
1cbf0 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  ) to access data
1cc00 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69   beyond this poi
1cc10 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20  nt from now on. 
1cc20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
1cc30 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
1cc40 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1cc50 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1cc60 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 0a  = nByte;.    }..
1cc70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cc80 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1cc90 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1cca0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1ccb0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1ccc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1ccd0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1cce0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1ccf0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1cd00 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1cd10 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1cd20 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1cd30 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1cd40 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1cd50 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1cd60 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1cd70 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1cd80 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1cd90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1cda0 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1cdb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1cdc0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1cdd0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1cde0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1cdf0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1ce00 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1ce10 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1ce20 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1ce30 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1ce40 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1ce50 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1ce60 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1ce70 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1ce80 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1ce90 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1cea0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1ceb0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1cec0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1ced0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1cee0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1cef0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1cf00 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1cf10 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1cf20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1cf30 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1cf40 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1cf50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1cf60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cf70 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1cf80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1cf90 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1cfa0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1cfb0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1cfc0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1cfd0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1cfe0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1cff0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d000 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d010 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1d020 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1d030 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1d040 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d050 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1d060 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1d070 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1d080 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1d090 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1d0a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1d0b0 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1d0c0 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1d0d0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1d0e0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1d0f0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1d100 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1d110 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1d120 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d130 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1d140 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1d150 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1d160 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1d170 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d180 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1d190 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d1a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1d1b0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d1c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d1d0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1d1e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1d1f0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1d200 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1d210 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1d220 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1d230 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  f) ) return SQLI
1d240 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1d250 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1d260 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1d270 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1d280 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1d290 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1d2a0 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1d2b0 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1d2c0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1d2d0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1d2e0 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1d2f0 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1d300 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1d310 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1d320 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1d330 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1d340 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1d350 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1d360 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1d370 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1d380 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1d390 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1d3a0 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1d3b0 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1d3c0 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1d3d0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1d3e0 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1d3f0 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1d400 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1d410 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1d420 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1d430 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1d440 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1d450 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1d460 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d470 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1d480 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1d490 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1d4a0 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1d4b0 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1d4c0 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
1d4d0 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
1d4e0 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
1d4f0 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
1d500 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1d510 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
1d520 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1d530 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
1d540 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1d550 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
1d560 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
1d570 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
1d580 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
1d590 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1d5a0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
1d5b0 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
1d5c0 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1d5d0 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
1d5e0 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
1d5f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1d600 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1d610 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1d620 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1d630 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1d640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d650 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1d660 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1d670 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1d680 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1d690 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
1d6a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
1d6b0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1d6c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d6d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1d6e0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1d6f0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1d700 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1d710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d720 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
1d730 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
1d740 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
1d750 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
1d760 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20  Write<nSize ){. 
1d770 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74         int nWrit
1d780 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1d790 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1d7a0 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1d7b0 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1d7c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d7d0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1d7e0 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c     iWrite += nBl
1d7f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1d800 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  f.    }.  }..  i
1d810 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 4c 69  f( pFile->mmapLi
1d820 6d 69 74 3e 30 20 26 26 20 6e 42 79 74 65 3e 70  mit>0 && nByte>p
1d830 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1d840 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1d850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1d860 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20  hunk<=0 ){.     
1d870 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1d880 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1d890 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1d8a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1d8b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1d8c0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1d8d0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d8e0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1d8f0 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1d900 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1d910 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1d920 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1d930 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1d940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d950 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1d960 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1d970 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1d980 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1d990 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1d9a0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1d9b0 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1d9c0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1d9d0 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1d9e0 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1d9f0 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1da00 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1da10 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1da20 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1da30 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1da40 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1da50 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1da60 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1da70 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1da80 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1da90 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1daa0 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1dab0 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1dac0 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1dad0 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1dae0 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1daf0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1db00 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1db10 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1db20 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1db30 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1db40 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1db50 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1db60 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1db70 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1db80 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1db90 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1dba0 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1dbb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1dbc0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1dbd0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1dbe0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1dbf0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1dc00 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1dc10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1dc20 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1dc30 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1dc40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1dc50 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1dc60 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1dc70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1dc80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1dc90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1dca0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
1dcb0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1dcc0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1dcd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1dce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1dcf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1dd00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1dd10 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1dd20 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1dd30 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1dd40 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1dd50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dd60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1dd70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1dd80 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1dd90 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1dda0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ddb0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1ddc0 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1ddd0 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1dde0 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1ddf0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1de00 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1de10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1de20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1de30 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1de40 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1de50 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1de60 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1de70 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1de80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1de90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1dea0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1deb0 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1dec0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1ded0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1dee0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1def0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1df00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1df20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1df30 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1df40 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1df50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1df60 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1df70 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1df80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1dfa0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1dfb0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1dfc0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1dfd0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1dfe0 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56  alloc( pFile->pV
1dff0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1e000 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1e010 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1e020 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1e030 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1e040 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1e050 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1e060 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1e070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e090 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e0a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1e0b0 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 20 20  _LIMIT: {.      
1e0c0 70 46 69 6c 65 2d 3e 6d 6d 61 70 4c 69 6d 69 74  pFile->mmapLimit
1e0d0 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1e0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e0f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1e100 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e110 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1e120 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1e130 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1e140 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1e150 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1e160 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1e170 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1e180 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1e190 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1e1a0 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1e1b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1e1c0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1e1d0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1e1e0 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1e1f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e200 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1e210 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1e220 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1e230 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1e240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e250 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1e260 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e270 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1e280 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1e290 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1e2a0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
1e2b0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1e2c0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
1e2d0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1e2e0 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1e2f0 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1e300 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1e310 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1e320 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e330 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1e340 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
1e350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e360 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
1e370 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1e380 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1e390 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1e3a0 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1e3b0 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1e3c0 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1e3d0 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1e3e0 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1e3f0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1e400 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1e410 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1e420 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1e430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1e440 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1e450 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1e460 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1e470 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1e480 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1e490 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1e4a0 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1e4b0 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1e4c0 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1e4d0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1e4e0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1e4f0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66  for both..*/.#if
1e500 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  ndef __QNXNTO__ 
1e510 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e520 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1e530 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1e540 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1e550 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1e560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e570 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1e580 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  IZE;.}.#endif../
1e590 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1e5a0 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e  ng version of un
1e5b0 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  ixSectorSize() i
1e5c0 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20  s optimized for 
1e5d0 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  QNX..*/.#ifdef _
1e5e0 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75  _QNXNTO__.#inclu
1e5f0 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
1e600 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1e610 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
1e620 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1e630 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1e640 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
1e650 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1e660 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1e670 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1e680 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
1e690 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
1e6a0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
1e6b0 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
1e6c0 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
1e6d0 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
1e6e0 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
1e6f0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1e700 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1e710 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
1e720 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1e730 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
1e740 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
1e750 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
1e760 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
1e770 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
1e780 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1e790 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72   }..    if( !str
1e7a0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1e7b0 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20  etype, "tmp") ) 
1e7c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e7d0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1e7e0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1e7f0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1e800 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1e810 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1e820 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c  IOCAP_ATOMIC4K |
1e830 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61         /* All ra
1e840 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  m filesystem wri
1e850 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1e860 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1e870 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1e880 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1e890 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1e8a0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1e8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1e8e0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1e8f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e900 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1e910 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1e920 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1e930 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1e970 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1e980 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1e990 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49  e if( strstr(fsI
1e9a0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1e9b0 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20  "etfs") ){.     
1e9c0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e9d0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1e9e0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1e9f0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1ea00 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1ea10 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65    /* etfs cluste
1ea20 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72  r size writes ar
1ea30 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1ea40 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74      (pFile->sect
1ea50 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
1ea60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1ea70 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20  IC512) |.       
1ea80 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1ea90 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1eaa0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1eab0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1eac0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1eaf0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1eb00 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1eb10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1eb20 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1eb30 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1eb40 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1eb50 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1eb80 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1eb90 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1eba0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74     }else if( !st
1ebb0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1ebc0 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20  setype, "qnx6") 
1ebd0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1ebe0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1ebf0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1ec00 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1ec10 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1ec20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1ec30 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20  _IOCAP_ATOMIC | 
1ec40 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66          /* All f
1ec50 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
1ec60 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1ec70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1ec80 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1ec90 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1eca0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1ecb0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1ecf0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1ed00 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1ed10 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1ed20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1ed30 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1ed40 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1ed80 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1ed90 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1eda0 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1edb0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
1edc0 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx4") ){.      p
1edd0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ede0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1edf0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1ee00 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1ee10 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1ee20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
1ee30 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
1ee40 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
1ee50 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
1ee60 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
1ee70 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1ee80 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1ee90 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
1eea0 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
1eeb0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1eec0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1eed0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1eee0 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1eef0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1ef20 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1ef30 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1ef40 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
1ef50 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
1ef60 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a  type, "dos") ){.
1ef70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1ef80 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1ef90 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1efa0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1efb0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1efc0 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1efd0 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1efe0 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1eff0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1f000 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1f010 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f020 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1f030 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1f040 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1f050 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f060 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1f070 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1f080 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1f090 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1f0d0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1f0e0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    0;.    }else{.
1f0f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f100 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f110 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1f120 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f130 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c  512 |      /* bl
1f140 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ocks are atomic 
1f150 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1f160 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1f170 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1f180 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1f190 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1f1a0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1f1d0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1f1e0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1f1f0 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20  }.  }.  /* Last 
1f200 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74  chance verificat
1f210 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
1f220 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61  tor size isn't a
1f230 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32   multiple of 512
1f240 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
1f250 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69  n't valid.*/.  i
1f260 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1f270 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20  Size % 512 != 0 
1f280 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  ){.    pFile->de
1f290 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f2a0 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ics = 0;.    pFi
1f2b0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f2c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f2d0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1f2e0 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
1f2f0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23  >sectorSize;.}.#
1f300 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54  endif /* __QNXNT
1f310 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  O__ */../*.** Re
1f320 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
1f330 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1f340 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  for the file..**
1f350 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20  .** This VFS is 
1f360 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e  set up to return
1f370 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1f380 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1f390 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a  E by default..**
1f3a0 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63   However, that c
1f3b0 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61 76  hoice is contrav
1f3c0 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63  ersial since tec
1f3d0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64  hnically the und
1f3e0 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20  erlying.** file 
1f3f0 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
1f400 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70  always provide p
1f410 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69  owersafe overwri
1f420 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a  tes.  (In other.
1f430 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20  ** words, after 
1f440 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65  a power-loss eve
1f450 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65  nt, parts of the
1f460 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20   file that were 
1f470 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e  never.** written
1f480 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
1f490 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48  ing altered.)  H
1f4a0 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57  owever, non-PSOW
1f4b0 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72   behavior is ver
1f4c0 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e  y,.** very rare.
1f4d0 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20    And asserting 
1f4e0 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72  PSOW makes a lar
1f4f0 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20  ge reduction in 
1f500 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
1f510 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f   required I/O fo
1f520 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69  r journaling, si
1f530 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64  nce a lot of pad
1f540 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74  ding is eliminat
1f550 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77  ed..**  Hence, w
1f560 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f  hile POWERSAFE_O
1f570 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62  VERWRITE is on b
1f580 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
1f590 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72   is a file-contr
1f5a0 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ol.** available 
1f5b0 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61  to turn it off a
1f5c0 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72  nd URI query par
1f5d0 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65  ameter available
1f5e0 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e   to turn it off.
1f5f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1f600 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1f610 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1f620 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
1f630 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
1f640 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1f650 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20   rc = 0;.#ifdef 
1f660 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28  __QNXNTO__.  if(
1f670 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d   p->sectorSize==
1f680 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69  0 ) unixSectorSi
1f690 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70  ze(id);.  rc = p
1f6a0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f6b0 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a  ristics;.#endif.
1f6c0 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61    if( p->ctrlFla
1f6d0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53  gs & UNIXFILE_PS
1f6e0 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20  OW ){.    rc |= 
1f6f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1f700 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1f710 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f720 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1f730 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a  LITE_OMIT_WAL...
1f740 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1f750 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1f760 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1f770 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20  buffer.  .**.** 
1f780 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1f790 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1f7a0 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c  nce the same wal
1f7b0 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72  -index, each thr
1f7c0 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f  ead.** has its o
1f7d0 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  wn unixShm objec
1f7e0 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20  t, but they all 
1f7f0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
1f800 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  e instance.** of
1f810 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1f820 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  e object.  In ot
1f830 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20  her words, each 
1f840 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65  wal-index is ope
1f850 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65  ned.** only once
1f860 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1f870 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d  .** Each unixShm
1f880 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1f890 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69  onnected to a si
1f8a0 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ngle unixInodeIn
1f8b0 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65  fo object..** We
1f8c0 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20   could coalesce 
1f8d0 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f  this object into
1f8e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20   unixInodeInfo, 
1f8f0 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  but that would m
1f900 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65  ean.** every ope
1f910 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73  n file that does
1f920 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20   not use shared 
1f930 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72  memory (in other
1f940 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20   words, most.** 
1f950 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c  open files) woul
1f960 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20  d have to carry 
1f970 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72  around this extr
1f980 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  a information.  
1f990 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e  So.** the unixIn
1f9a0 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  odeInfo object c
1f9b0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1f9c0 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68  r to this unixSh
1f9d0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  mNode object.** 
1f9e0 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  and the unixShmN
1f9f0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ode object is cr
1fa00 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  eated only when 
1fa10 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e  needed..**.** un
1fa20 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
1fa30 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1fa40 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1fa50 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1fa60 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1fa70 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1fa80 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1fa90 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1faa0 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68     nRef.**.** Th
1fab0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1fac0 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
1fad0 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
1fae0 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
1faf0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
1fb00 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1fb10 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
1fb20 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  xShmNode.mutex m
1fb30 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
1fb40 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
1fb50 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
1fb60 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1fb70 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1fb80 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1fb90 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1fba0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1fbb0 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1fbc0 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
1fbd0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1fbe0 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
1fbf0 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
1fc00 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
1fc10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1fc20 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1fc30 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1fc40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1fc50 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1fc60 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1fc70 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70  Name of the mmap
1fc80 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1fc90 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1fcb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fcc0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1fcd0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1fce0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1fcf0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1fd00 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69  s */.  u16 nRegi
1fd10 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1fd20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1fd30 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1fd40 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fd60 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
1fd70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
1fd80 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1fd90 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
1fda0 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
1fdb0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1fdc0 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1fdd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1fde0 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
1fdf0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1fe00 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
1fe10 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
1fe20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
1fe30 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1fe40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1fe50 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1fe60 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
1fe70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1fe80 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1fe90 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1fea0 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
1feb0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1fec0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1fed0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1fee0 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
1fef0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1ff00 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
1ff10 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
1ff20 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1ff30 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
1ff40 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
1ff50 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
1ff60 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
1ff70 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
1ff80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
1ff90 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1ffa0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1ffb0 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
1ffc0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
1ffd0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1ffe0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
1fff0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
20000 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
20010 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75  hm.pFile.**    u
20020 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  nixShm.id.**.** 
20030 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
20040 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
20050 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46    The unixShm.pF
20060 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
20070 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
20080 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
20090 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
200a0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
200b0 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  Shm {.  unixShmN
200c0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
200d0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
200e0 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ying unixShmNode
200f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
20100 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
20110 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
20120 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
20130 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64   same unixShmNod
20140 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
20150 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
20160 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
20170 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d  ding the unixShm
20180 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
20190 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
201a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
201b0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
201c0 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
201d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
201e0 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
201f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20200 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
20210 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
20220 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
20230 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
20240 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
20250 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f  ks held */.};../
20260 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
20270 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
20280 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
20290 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
202a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
202b0 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20  )*4)         /* 
202c0 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
202d0 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
202e0 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58  SHM_DMS    (UNIX
202f0 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
20300 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
20310 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
20320 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
20330 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
20340 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
20350 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f  s from ofst thro
20360 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a  ugh ofst+n-1..**
20370 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
20380 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
20390 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
203a0 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
203b0 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
203c0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
203d0 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
203e0 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e  Lock(.  unixShmN
203f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f  ode *pShmNode, /
20400 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
20410 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
20420 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
20430 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
20440 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
20450 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
20460 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
20470 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
20480 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20490 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
204a0 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
204b0 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
204c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
204d0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
204e0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
204f0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
20500 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
20510 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
20520 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
20530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20540 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f  ;   /* Result co
20550 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
20560 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
20570 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
20580 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
20590 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
205a0 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
205b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
205c0 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
205d0 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
205e0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
205f0 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
20600 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
20610 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
20620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
20630 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
20640 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
20650 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
20660 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
20670 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
20680 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
20690 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
206a0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
206b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
206c0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
206d0 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
206e0 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
206f0 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
20700 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
20710 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
20720 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
20730 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
20740 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
20750 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
20760 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
20770 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
20780 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
20790 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
207a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
207b0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
207c0 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
207d0 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
207e0 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
207f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
20800 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
20810 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
20820 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
20830 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
20840 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28  (1<<ofst);.  if(
20850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20860 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
20870 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
20880 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
20890 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  nlock %d ok", of
208a0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
208b0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
208c0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
208d0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
208e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
208f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
20900 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
20910 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
20920 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b  "read-lock %d ok
20930 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
20940 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
20950 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
20960 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
20970 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
20980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20990 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
209a0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
209b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
209c0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b  write-lock %d ok
209d0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
209e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
209f0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
20a00 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
20a10 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
20a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
20a30 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
20a40 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
20a50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
20a60 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
20a70 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c   ofst));.    }el
20a80 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
20a90 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
20aa0 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
20ab0 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
20ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ad0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
20ae0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
20af0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
20b00 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69  rite-lock %d fai
20b10 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
20b20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
20b30 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64  E((" - afterward
20b40 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  s %03x,%03x\n",.
20b50 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
20b60 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  ode->sharedMask,
20b70 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
20b80 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ask));.  }.#endi
20b90 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  f..  return rc; 
20ba0 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a         .}.../*.*
20bb0 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
20bc0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
20bd0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
20be0 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
20bf0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
20c00 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
20c10 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
20c20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
20c30 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
20c40 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
20c50 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
20c60 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
20c70 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
20c80 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
20c90 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
20ca0 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
20cb0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
20cc0 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
20cd0 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
20ce0 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d  ( p && p->nRef==
20cf0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
20d00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
20d10 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
20d20 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
20d30 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
20d40 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
20d50 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
20d60 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
20d70 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
20d80 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
20d90 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
20da0 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
20db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20dc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20dd0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
20de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20df0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20e00 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
20e10 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
20e20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
20e30 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
20e40 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
20e50 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
20e60 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
20e70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
20e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
20e90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
20ea0 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
20eb0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
20ec0 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
20ed0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
20ee0 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
20ef0 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
20f00 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
20f10 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
20f20 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
20f30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
20f40 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
20f50 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
20f60 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
20f70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
20f80 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
20f90 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
20fa0 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
20fb0 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
20fc0 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
20fd0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
20fe0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20ff0 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
21000 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
21010 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
21020 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
21030 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
21040 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
21050 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
21060 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
21070 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
21080 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
21090 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
210a0 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
210b0 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
210c0 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
210d0 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
210e0 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
210f0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
21100 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
21110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21120 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
21130 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
21140 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
21150 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
21160 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
21170 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
21180 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
21190 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
211a0 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
211b0 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
211c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
211d0 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
211e0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
211f0 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
21200 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
21210 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
21220 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
21230 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
21240 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
21250 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
21260 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
21270 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
21280 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
21290 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
212a0 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
212b0 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
212c0 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
212d0 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
212e0 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
212f0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
21300 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
21310 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
21320 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
21330 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
21340 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
21350 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
21360 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
21370 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
21380 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
21390 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
213a0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
213b0 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
213c0 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
213d0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
213e0 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
213f0 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
21400 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
21410 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
21420 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
21430 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
21440 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
21450 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
21460 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
21470 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
21480 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
21490 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
214a0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
214b0 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
214c0 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
214d0 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
214e0 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
214f0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
21500 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
21510 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
21520 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
21530 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
21540 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
21550 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
21560 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
21570 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
21580 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
21590 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
215a0 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
215b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
215c0 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
215d0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
215e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
215f0 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
21600 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
21610 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
21620 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
21630 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
21640 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
21650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
21660 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
21670 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
21680 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
21690 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
216a0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
216b0 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
216c0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
216d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
216e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
216f0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
21700 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
21710 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
21720 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21730 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
21740 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
21770 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
21780 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
21790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
217a0 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
217b0 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
217c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
217d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
217e0 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
217f0 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
21800 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
21810 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
21820 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
21830 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
21840 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
21850 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
21860 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
21870 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
21880 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
21890 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
218a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
218b0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
218c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
218d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
218e0 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
218f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
21900 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
21910 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
21920 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
21930 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
21940 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
21950 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
21960 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
21970 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
21980 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
21990 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
219a0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
219b0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
219c0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
219d0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
219e0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a00 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
21a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
21a20 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
21a30 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
21a40 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
21a50 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
21a60 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
21a70 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
21a80 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
21a90 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
21aa0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
21ab0 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
21ac0 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
21ad0 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  issions..    */.
21ae0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
21af0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
21b00 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
21b10 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
21b20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21b30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
21b40 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
21b50 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
21b60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
21b70 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
21b80 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
21b90 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
21ba0 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b  DIRECTORY) + 31;
21bb0 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
21bc0 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69  ilename = 6 + (i
21bd0 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
21be0 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
21bf0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
21c00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
21c10 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
21c20 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
21c30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
21c40 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
21c50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21c60 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
21c70 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
21c80 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
21c90 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
21ca0 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d  (*pShmNode)+nShm
21cb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
21cc0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53  ShmFilename = pS
21cd0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
21ce0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
21cf0 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Node[1];.#ifdef 
21d00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
21d10 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33  TORY.    sqlite3
21d20 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
21d30 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
21d40 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
21d50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21d60 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21d70 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
21d80 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
21d90 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
21da0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
21db0 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
21dc0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
21dd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
21de0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
21df0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
21e00 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
21e10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
21e20 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
21e30 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
21e40 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
21e50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
21e60 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
21e70 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
21e80 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
21e90 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
21ea0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
21eb0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
21ec0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
21ed0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
21ee0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
21ef0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
21f00 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
21f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21f20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
21f30 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
21f40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
21f50 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
21f60 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
21f70 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
21f80 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
21f90 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
21fa0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
21fb0 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
21fc0 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20  adonly_shm", 0) 
21fd0 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46  ){.        openF
21fe0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
21ff0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
22000 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
22010 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
22020 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
22030 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
22040 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  ilename, openFla
22050 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f  gs, (sStat.st_mo
22060 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20  de&0777));.     
22070 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
22080 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  <0 ){.        rc
22090 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
220a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
220b0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53  BKPT, "open", zS
220c0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
220d0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
220e0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  en_err;.      }.
220f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
22100 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
22110 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61  ning as root, ma
22120 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
22130 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20   SHM file.      
22140 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  ** is owned by t
22150 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61  he same user tha
22160 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69  t owns the origi
22170 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f  nal database.  O
22180 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
22190 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
221a0 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62  owner will not b
221b0 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  e able to connec
221c0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
221d0 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e    osFchown(pShmN
221e0 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
221f0 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
22200 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  id);.  .      /*
22210 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22220 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
22230 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
22240 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
22250 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  .      ** If not
22260 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
22270 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
22280 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  th. .      */.  
22290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
222a0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  OK;.      if( un
222b0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
222c0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
222d0 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
222e0 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
222f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f  {.        if( ro
22300 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
22310 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29  ShmNode->h, 0) )
22320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22330 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
22340 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
22350 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  EN, "ftruncate",
22360 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
22370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22380 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
22390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
223a0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
223b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
223c0 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  Node, F_RDLCK, U
223d0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  NIX_SHM_DMS, 1);
223e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
223f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
22400 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
22410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
22420 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
22430 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
22440 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
22450 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
22460 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
22470 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22480 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
22490 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
224a0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
224b0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
224c0 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
224d0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
224e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
224f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
22500 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
22510 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
22520 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
22530 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
22540 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
22550 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
22560 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
22570 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
22580 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63  t unixShm) objec
22590 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
225a0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
225b0 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
225c0 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
225d0 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
225e0 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
225f0 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
22600 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
22610 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
22620 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
22630 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
22640 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
22650 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
22660 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
22670 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
22680 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
22690 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
226a0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
226b0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
226c0 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
226d0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
226e0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
226f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
22700 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
22710 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
22720 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75  hm_open_err:.  u
22730 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
22740 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69  d);       /* Thi
22750 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
22760 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
22770 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
22780 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65  ree(p);.  unixLe
22790 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
227a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
227b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
227c0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
227d0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
227e0 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
227f0 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65  of the .** share
22800 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d-memory associa
22810 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
22820 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53  abase file fd. S
22830 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
22840 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d  ions .** are num
22850 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66  bered starting f
22860 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73  rom zero. Each s
22870 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
22880 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20  ion is szRegion 
22890 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
228a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
228b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
228c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
228d0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
228e0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
228f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22900 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70  if the bExtend p
22910 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
22920 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
22930 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
22940 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
22950 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
22960 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
22970 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
22980 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
22990 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
229a0 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
229b0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
229c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
229d0 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69  If .** bExtend i
229e0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
229f0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
22a00 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
22a10 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a  n has not yet .*
22a20 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
22a30 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  , it is allocate
22a40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
22a50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
22a60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
22a70 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  egion has alread
22a80 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
22a90 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   or is allocated
22aa0 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c   by.** this call
22ab0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
22ac0 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ove, then it is 
22ad0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
22ae0 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61   processes .** a
22af0 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
22b00 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22b10 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
22b20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
22b30 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72  mapped .** memor
22b40 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
22b50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22b60 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d  tic int unixShmM
22b70 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
22b80 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
22b90 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
22ba0 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
22bb0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
22bc0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
22bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22be0 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
22bf0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
22c00 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
22c10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22c20 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
22c30 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20  t bExtend,      
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c50 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
22c60 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
22c70 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
22c80 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
22c90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
22ca0 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
22cb0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
22cc0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
22cd0 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
22ce0 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  *p;.  unixShmNod
22cf0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
22d00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22d10 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  K;..  /* If the 
22d20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
22d30 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
22d40 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
22d50 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
22d60 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
22d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
22d80 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
22d90 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
22da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22db0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
22dc0 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
22dd0 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
22de0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
22df0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
22e00 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
22e10 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
22e20 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
22e30 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
22e40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
22e50 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
22e60 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
22e70 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
22e80 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
22e90 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
22ea0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
22eb0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
22ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
22ed0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
22ee0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
22ef0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
22f00 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
22f10 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
22f20 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  on ){.    char *
22f30 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f50 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61  New apRegion[] a
22f60 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
22f70 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e  nByte = (iRegion
22f80 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f  +1)*szRegion;  /
22f90 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
22fa0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
22fb0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
22fc0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
22fd0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
22fe0 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20  y fstat() */..  
22ff0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
23000 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
23010 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ..    if( pShmNo
23020 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
23030 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
23040 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
23050 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
23060 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
23070 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20  ess space..     
23080 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
23090 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
230a0 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
230b0 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
230c0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a   file is.      *
230d0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
230e0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
230f0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
23100 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23110 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d  if( osFstat(pShm
23120 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  Node->h, &sStat)
23130 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
23150 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67  MSIZE;.        g
23160 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
23170 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
23180 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73    if( sStat.st_s
23190 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20  ize<nByte ){.   
231a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
231b0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
231c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
231d0 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69  st. If bExtend i
231e0 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20  s set to.       
231f0 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20   ** false, exit 
23200 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
23210 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
23220 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
23230 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  urned..        *
23240 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74  *.        ** Alt
23250 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62  ernatively, if b
23260 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20  Extend is true, 
23270 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20  use ftruncate() 
23280 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
23290 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
232a0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
232b0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
232c0 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
232d0 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  end ) goto shmpa
232e0 67 65 5f 6f 75 74 3b 0a 23 69 66 20 64 65 66 69  ge_out;.#if defi
232f0 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
23300 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
23310 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
23320 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  E.        if( os
23330 46 61 6c 6c 6f 63 61 74 65 28 70 53 68 6d 4e 6f  Fallocate(pShmNo
23340 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
23350 73 69 7a 65 2c 20 6e 42 79 74 65 29 21 3d 30 20  size, nByte)!=0 
23360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23370 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
23380 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
23390 49 5a 45 2c 20 22 66 61 6c 6c 6f 63 61 74 65 22  IZE, "fallocate"
233a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
233c0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
233d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
233e0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
233f0 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
23400 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
23410 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
23420 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
23430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23440 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
23450 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
23460 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65  SIZE, "ftruncate
23470 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23490 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
234a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
234b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
234c0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
234d0 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  f.      }.    }.
234e0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
234f0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
23500 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
23510 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
23520 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
23530 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
23540 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
23550 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
23560 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
23570 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
23580 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
23590 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
235a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
235b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
235c0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
235d0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
235e0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
235f0 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
23600 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e  .    while(pShmN
23610 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
23620 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f  egion){.      vo
23630 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
23640 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
23650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =0 ){.        pM
23660 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 73  em = osMmap(0, s
23670 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  zRegion,.       
23680 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
23690 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
236a0 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
236b0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
236c0 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
236d0 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
236e0 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
236f0 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
23700 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
23710 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
23720 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
23730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
23740 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
23750 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
23760 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
23770 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
23780 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
23790 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
237a0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
237b0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
237c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
237d0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
237e0 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
237f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23810 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
23820 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
23830 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
23840 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65  et(pMem, 0, szRe
23850 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gion);.      }. 
23860 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
23870 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
23880 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65  ->nRegion] = pMe
23890 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  m;.      pShmNod
238a0 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
238b0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
238c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
238d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
238e0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
238f0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
23900 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
23910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
23920 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
23930 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
23940 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
23950 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
23960 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
23970 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
23980 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
23990 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
239a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
239b0 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
239c0 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
239d0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
239e0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
239f0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
23a00 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
23a10 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
23a20 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
23a30 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
23a40 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
23a50 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
23a60 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
23a70 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
23a80 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
23a90 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
23aa0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
23ab0 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
23ac0 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
23ad0 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
23ae0 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
23af0 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
23b00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
23b10 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
23b20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
23b30 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
23b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
23b50 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
23b60 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
23b70 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
23b80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23b90 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
23ba0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
23bb0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
23bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23bd0 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
23be0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
23bf0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
23c00 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
23c10 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
23c20 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
23c30 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
23c40 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
23c50 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
23c60 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
23c70 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
23c80 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
23c90 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23cb0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
23cc0 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
23cd0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
23d00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
23d10 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
23d20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
23d30 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
23d40 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
23d50 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
23d60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
23d70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
23da0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
23dd0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
23de0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
23df0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
23e00 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
23e10 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
23e20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
23e30 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
23e40 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
23e50 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
23e60 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
23e70 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
23e80 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
23e90 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
23ea0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
23eb0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
23ec0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
23ed0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
23ee0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
23ef0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
23f00 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
23f10 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
23f20 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
23f30 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
23f40 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
23f50 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
23f60 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
23f70 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
23f80 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
23f90 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
23fa0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
23fb0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
23fc0 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
23fd0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23fe0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
23ff0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
24000 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
24010 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
24020 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
24030 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
24040 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
24050 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
24060 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
24070 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
24080 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24090 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
240a0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
240b0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
240c0 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
240d0 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
240e0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
240f0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
24100 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
24110 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
24120 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
24130 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
24140 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
24150 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
24160 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
24170 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
24180 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
24190 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
241a0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
241b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
241c0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
241d0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
241e0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
241f0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
24200 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
24210 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
24220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
24230 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
24240 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
24250 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
24260 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
24270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24290 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
242a0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
242b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
242c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
242d0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
242e0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
242f0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
24300 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
24310 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
24320 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
24330 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
24340 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
24350 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
24360 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
24370 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
24380 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
24390 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
243a0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
243b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
243c0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
243d0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
243e0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
243f0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
24400 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
24410 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
24420 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
24430 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
24440 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
24450 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
24460 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
24470 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
24480 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
24490 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
244a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
244b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
244c0 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
244d0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
244e0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
244f0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
24500 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
24510 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
24520 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
24530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24540 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
24550 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
24560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
24570 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
24580 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
24590 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
245a0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
245b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
245c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
245d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
245e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
245f0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
24600 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
24610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24620 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
24630 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
24640 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
24650 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
24660 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
24670 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
24680 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
24690 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
246a0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
246b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
246c0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
246d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
246e0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
246f0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
24700 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
24710 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
24720 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
24730 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
24740 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
24750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
24760 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
24770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24780 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
24790 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
247a0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
247b0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
247c0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
247d0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
247e0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
247f0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
24800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
24810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24820 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
24830 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
24840 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
24850 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
24860 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
24870 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24880 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
24890 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
248a0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
248b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
248c0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
248d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
248e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
248f0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
24900 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
24910 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
24920 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
24930 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
24940 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
24950 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
24960 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
24970 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
24980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24990 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
249a0 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
249b0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
249c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
249d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
249e0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
249f0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
24a00 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
24a10 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
24a20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
24a30 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
24a40 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
24a50 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
24a60 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
24a70 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
24a80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
24a90 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
24aa0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
24ab0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
24ac0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
24ad0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
24ae0 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
24af0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
24b00 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
24b10 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
24b20 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
24b30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
24b40 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
24b50 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
24b60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
24b70 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
24b80 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
24b90 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
24ba0 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
24bb0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
24bc0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
24bd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
24be0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
24bf0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
24c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24c10 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
24c20 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
24c30 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
24c60 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
24c70 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
24c80 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
24c90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
24ca0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
24cb0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
24cc0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
24cd0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
24ce0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
24cf0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
24d00 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
24d10 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
24d20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
24d30 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
24d40 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
24d50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
24d60 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
24d70 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
24d80 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
24d90 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
24da0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
24db0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
24dc0 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
24dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24de0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
24df0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
24e00 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
24e10 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
24e20 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
24e30 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
24e40 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
24e50 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
24e60 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
24e70 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
24e80 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
24e90 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
24ea0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
24eb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
24ec0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
24ed0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
24ee0 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
24ef0 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
24f00 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
24f10 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
24f20 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
24f30 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
24f40 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
24f50 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
24f60 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
24f70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
24f80 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
24f90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
24fa0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
24fb0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
24fc0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
24fd0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
24fe0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
24ff0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
25000 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
25010 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
25020 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
25030 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
25040 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
25050 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
25060 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
25070 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e  ode->h>=0 ) osUn
25080 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
25090 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
250a0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
250b0 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
250c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
250d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
250e0 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
250f0 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
25100 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
25110 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
25120 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
25130 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
25140 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
25150 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
25160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25170 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  _WAL */../*.** I
25180 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
25190 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
251a0 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
251b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
251c0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
251d0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
251e0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
251f0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
25200 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
25210 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
25220 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
25230 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 4f 72 69  on, pFd->mmapOri
25240 67 73 69 7a 65 29 3b 0a 20 20 20 20 70 46 64 2d  gsize);.    pFd-
25250 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
25260 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
25270 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
25280 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20 3d 20  >mmapOrigsize = 
25290 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
252a0 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65  Return the syste
252b0 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2f 0a  m page size..*/.
252c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
252d0 65 74 50 61 67 65 73 69 7a 65 28 76 6f 69 64 29  etPagesize(void)
252e0 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
252f0 50 0a 20 20 72 65 74 75 72 6e 20 35 31 32 3b 0a  P.  return 512;.
25300 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42  #elif defined(_B
25310 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74  SD_SOURCE).  ret
25320 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28  urn getpagesize(
25330 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
25340 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f  n (int)sysconf(_
25350 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65  SC_PAGESIZE);.#e
25360 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ndif.}../*.** At
25370 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
25380 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
25390 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
253a0 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
253b0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
253c0 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
253d0 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
253e0 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
253f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
25400 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
25410 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
25420 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
25430 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
25440 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
25450 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
25460 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
25470 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
25480 65 2e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 0a 2a  e.mmapOrigsize.*
25490 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73  *.** If unsucces
254a0 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d  sful, an error m
254b0 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64  essage is logged
254c0 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67   via sqlite3_log
254d0 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68  () and.** the th
254e0 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62  ree variables ab
254f0 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ove are zeroed. 
25500 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
25510 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f  ite should.** co
25520 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67  ntinue accessing
25530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
25540 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20  ing the xRead() 
25550 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20  and xWrite().** 
25560 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
25570 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61  ic void unixRema
25580 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c  pfile(.  unixFil
25590 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
255a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
255b0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65   descriptor obje
255c0 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77  ct */.  i64 nNew
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
255f0 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  red mapping size
25600 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
25610 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61  har *zErr = "mma
25620 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  p";.  int h = pF
25630 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20  d->h;           
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25650 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
25660 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f  en on db file */
25670 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28  .  u8 *pOrig = (
25680 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
25690 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74  gion;   /* Point
256a0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69  er to current fi
256b0 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  le mapping */.  
256c0 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d  i64 nOrig = pFd-
256d0 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 3b 20 20  >mmapOrigsize;  
256e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
256f0 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20  pOrig region in 
25700 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  bytes */.  u8 *p
25710 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e  /* Location of n
25740 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ew mapping */.  
25750 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54  int flags = PROT
25760 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20  _READ;          
25770 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
25780 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20   pass to mmap() 
25790 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
257a0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
257b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
257c0 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  w>pFd->mmapSize 
257d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
257e0 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69  w<=pFd->mmapLimi
257f0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t );.  assert( n
25800 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  New>0 );.  asser
25810 74 28 20 70 46 64 2d 3e 6d 6d 61 70 4f 72 69 67  t( pFd->mmapOrig
25820 73 69 7a 65 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53  size>=pFd->mmapS
25830 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
25840 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29   MAP_FAILED!=0 )
25850 3b 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63  ;..  if( (pFd->c
25860 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
25870 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
25880 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57   flags |= PROT_W
25890 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72  RITE;..  if( pOr
258a0 69 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ig ){.    const 
258b0 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
258c0 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65 28  unixGetPagesize(
258d0 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
258e0 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
258f0 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
25900 2d 31 29 29 3b 0a 20 20 20 20 75 38 20 2a 70 52  -1));.    u8 *pR
25910 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75  eq = &pOrig[nReu
25920 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d  se];..    /* Unm
25930 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20  ap any pages of 
25940 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
25950 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74  ping that cannot
25960 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20   be reused. */. 
25970 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e     if( nReuse!=n
25980 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73  Orig ){.      os
25990 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72  Munmap(pReq, nOr
259a0 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  ig-nReuse);.    
259b0 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  }..#if HAVE_MREM
259c0 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  AP.    pNew = os
259d0 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Mremap(pOrig, nR
259e0 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d  euse, nNew, MREM
259f0 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20  AP_MAYMOVE);.   
25a00 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22   zErr = "mremap"
25a10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
25a20 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20   = osMmap(pReq, 
25a30 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61  nNew-nReuse, fla
25a40 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
25a50 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  h, nReuse);.    
25a60 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41  if( pNew!=MAP_FA
25a70 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66  ILED ){.      if
25a80 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a  ( pNew!=pReq ){.
25a90 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
25aa0 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52  (pNew, nNew - nR
25ab0 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70  euse);.        p
25ac0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  New = 0;.      }
25ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
25ae0 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20  ew = pOrig;.    
25af0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
25b00 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74  ..    /* The att
25b10 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74  empt to extend t
25b20 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
25b30 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65  ing failed. Free
25b40 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
25b50 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
25b60 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20   || pNew==0 ){. 
25b70 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f       osMunmap(pO
25b80 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  rig, nReuse);.  
25b90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
25ba0 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e   pNew is still N
25bb0 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61  ULL, try to crea
25bc0 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e  te an entirely n
25bd0 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  ew mapping. */. 
25be0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
25bf0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
25c00 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73  p(0, nNew, flags
25c10 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
25c20 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
25c30 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
25c40 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30   ){.    pNew = 0
25c50 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a  ;.    nNew = 0;.
25c60 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
25c70 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72  (SQLITE_OK, zErr
25c80 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a  , pFd->zPath);..
25c90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d      /* If the mm
25ca0 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65  ap() above faile
25cb0 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  d, assume that a
25cc0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d  ll subsequent mm
25cd0 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  ap() calls.    *
25ce0 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  * will probably 
25cf0 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62  fail too. Fall b
25d00 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65  ack to using xRe
25d10 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73  ad/xWrite exclus
25d20 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20  ively.    ** in 
25d30 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
25d40 20 20 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69     pFd->mmapLimi
25d50 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  t = 0;.  }.  pFd
25d60 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
25d70 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
25d80 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
25d90 46 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  Fd->mmapOrigsize
25da0 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
25db0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
25dc0 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
25dd0 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
25de0 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
25df0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
25e00 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
25e10 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
25e20 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
25e30 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
25e40 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
25e50 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
25e60 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
25e70 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
25e80 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
25e90 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
25ea0 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
25eb0 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
25ec0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25ed0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
25ee0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
25ef0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
25f00 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
25f10 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
25f20 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
25f30 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
25f40 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
25f50 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
25f60 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
25f70 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
25f80 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25f90 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
25fa0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
25fb0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
25fc0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
25fd0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
25fe0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
25ff0 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
26000 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
26010 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
26020 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
26030 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26040 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26050 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
26060 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
26070 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
26080 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
26090 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
260a0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
260b0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
260c0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
260d0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
260e0 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
260f0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
26100 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36  i64 nByte){.  i6
26110 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
26120 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
26130 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
26140 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
26150 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
26160 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
26170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26180 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
26190 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
261a0 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
261b0 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
261c0 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
261d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   */.    rc = osF
261e0 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
261f0 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
26200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26220 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
26230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
26240 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
26250 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
26260 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69  ap>pFd->mmapLimi
26270 74 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  t ){.    nMap = 
26280 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3b 0a  pFd->mmapLimit;.
26290 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21    }..  if( nMap!
262a0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
262b0 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e 30  {.    if( nMap>0
262c0 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52 65   ){.      unixRe
262d0 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
262e0 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
262f0 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
26300 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20  le(pFd);.    }. 
26310 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
26320 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26330 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
26340 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26350 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
26360 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
26370 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
26380 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
26390 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
263a0 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
263b0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
263c0 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
263d0 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
263e0 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
263f0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26400 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
26410 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
26420 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
26430 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
26440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26450 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
26460 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
26470 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
26480 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26490 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
264a0 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
264b0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
264c0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
264d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
264e0 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
264f0 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
26500 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
26510 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
26520 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
26530 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
26540 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
26550 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c  nt unixFetch(sql
26560 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
26570 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
26580 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 20  t, void **pp){. 
26590 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
265a0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
265b0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
265c0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
265d0 6c 65 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 30 3b  le */.  *pp = 0;
265e0 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  ..  if( pFd->mma
265f0 70 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  pLimit>0 ){.    
26600 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
26610 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
26620 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70  int rc = unixMap
26630 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
26640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26650 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26660 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
26670 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
26680 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
26690 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
266a0 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
266b0 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
266c0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
266d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
266e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
266f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
26700 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
26710 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
26720 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26730 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
26740 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
26750 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
26760 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
26770 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
26780 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
26790 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
267a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
267b0 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
267c0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
267d0 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
267e0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
267f0 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
26800 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
26810 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
26820 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
26830 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
26840 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
26850 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
26860 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
26870 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
26880 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
26890 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
268a0 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
268b0 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
268c0 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
268d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
268e0 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
268f0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
26900 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75  f, void *p){.  u
26910 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
26920 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
26930 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
26940 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
26950 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
26960 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
26970 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
26980 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
26990 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
269a0 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
269b0 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
269c0 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
269d0 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
269e0 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
269f0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
26a00 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
26a10 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
26a20 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
26a30 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
26a40 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
26a50 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
26a60 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
26a70 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
26a80 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
26a90 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
26aa0 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
26ab0 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
26ac0 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
26ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
26ae0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
26af0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
26b00 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
26b10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26b20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26b30 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
26b40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
26b50 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
26b60 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
26b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b80 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
26b90 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
26ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
26bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
26c10 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
26c20 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
26c30 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
26c40 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26c50 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
26c60 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
26c70 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
26c80 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
26c90 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
26ca0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
26cb0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
26cc0 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
26cd0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
26ce0 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
26cf0 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
26d00 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
26d10 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
26d20 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
26d30 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
26d40 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
26d50 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
26d60 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
26d70 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
26d80 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
26d90 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
26da0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
26db0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
26dc0 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
26dd0 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
26de0 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
26df0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26e00 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
26e10 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
26e20 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
26e30 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
26e40 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
26e50 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
26e60 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
26e70 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
26e80 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
26e90 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
26ea0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
26eb0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
26ec0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
26ed0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
26ee0 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
26ef0 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
26f00 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
26f10 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
26f20 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
26f30 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
26f40 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
26f50 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
26f60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26f70 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
26f80 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
26f90 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
26fa0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
26fb0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
26fc0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
26fd0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
26fe0 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
26ff0 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
27000 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
27010 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
27020 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
27030 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
27040 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
27050 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
27060 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
27070 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
27080 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
27090 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
270a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
270b0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
270c0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
270d0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
270e0 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
270f0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
27100 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
27110 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
27120 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
27130 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
27140 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
27150 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
27160 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
27170 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
27180 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
27190 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
271a0 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
271b0 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
271c0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
271d0 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
271e0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
271f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
27200 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
27230 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
27240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
27250 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
27280 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
27290 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
272a0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
272d0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
272e0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
272f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
27320 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
27330 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
27340 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
27370 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
27380 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
27390 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
273c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
273d0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
27410 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
27420 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
27430 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274c0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
27520 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27540 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
27550 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
27560 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
27570 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27590 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
275a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
275b0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
275e0 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
275f0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
27600 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
27610 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
27620 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27630 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20   unixShmMap,    
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27650 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
27680 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
27690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
276a0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
276d0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
276e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
276f0 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27710 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
27720 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
27730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
27740 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27760 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
27770 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
27780 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
27790 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
277c0 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
277d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
277e0 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
27860 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
27870 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
27880 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
27890 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
278a0 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
278b0 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
278c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
278d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
27900 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
279a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
279b0 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
279c0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
279d0 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
279e0 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
279f0 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
27a00 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
27a10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27a20 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
27a30 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
27a40 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
27a50 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
27a60 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
27a70 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
27a80 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
27a90 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
27aa0 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
27ab0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
27ac0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
27ad0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
27ae0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
27af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
27b00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
27b10 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
27b20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
27b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
27b40 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
27b50 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
27b60 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
27b90 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
27bc0 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27be0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
27bf0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
27c00 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
27c10 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
27c20 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
27c30 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
27c40 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
27c50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
27c60 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
27c70 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
27c80 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
27c90 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
27ca0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
27cb0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
27ce0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
27cf0 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
27d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d10 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
27d20 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d40 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
27d50 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
27d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27d70 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
27d80 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
27d90 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
27da0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
27db0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
27dc0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
27dd0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
27de0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
27df0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
27e00 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
27e10 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
27e20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27e30 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
27e40 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27e60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
27e70 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
27e80 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
27e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
27ea0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
27eb0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
27ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
27ed0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
27ee0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
27ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
27f00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
27f10 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
27f20 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
27f30 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
27f40 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
27f50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
27f60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
27f70 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
27f80 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
27f90 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
27fa0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
27fb0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
27fc0 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
27fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
27fe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
27ff0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28000 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28020 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28030 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
28040 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
28050 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28060 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
28070 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
28080 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
28090 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
280a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
280b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
280c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
280d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
280e0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
280f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28100 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
28110 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
28120 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
28130 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
28140 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
28150 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
28160 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
28170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28180 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28190 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
281a0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
281c0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
281d0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
281e0 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
281f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28200 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
28210 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
28220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28230 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28240 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
28250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28260 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
28270 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
28280 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
28290 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
282a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
282b0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
282c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
282d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
282e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
282f0 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
28300 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
28310 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28320 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
28330 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
28340 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28350 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28360 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28370 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
28380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28390 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
283a0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
283b0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
283c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
283d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
283e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
283f0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28400 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
28410 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
28420 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28430 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
28440 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28450 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
28460 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28470 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
28480 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
28490 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
284a0 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
284b0 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
284c0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
284d0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
284e0 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
284f0 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
28500 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
28510 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
28520 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
28530 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
28540 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
28550 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
28560 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
28570 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
28580 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
28590 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
285a0 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
285b0 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
285c0 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
285d0 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
285e0 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
285f0 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
28600 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
28610 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
28620 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
28630 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
28640 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
28650 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
28660 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
28670 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
28680 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28690 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
286a0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
286b0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
286c0 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
286d0 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
286e0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
286f0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
28700 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
28710 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
28720 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
28730 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
28740 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
28750 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
28760 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
28770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
28780 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
28790 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
287a0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
287b0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
287c0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
287d0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
28800 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
28810 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28830 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
28840 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28860 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
28870 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28890 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
288a0 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
288b0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
288c0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
288d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
288e0 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
288f0 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
28900 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
28910 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
28920 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
28930 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
28940 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
28950 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28960 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
28970 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
28980 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28990 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
289a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
289b0 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
289d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
289e0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
289f0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a10 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28a20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
28a30 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
28a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28a50 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28a60 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a80 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
28a90 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ab0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28ac0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
28ad0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
28ae0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28af0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28b00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
28b10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
28b20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28b30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
28b40 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
28b50 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
28b60 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
28b70 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
28b80 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
28b90 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
28ba0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
28bb0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
28bc0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
28bd0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
28be0 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
28bf0 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
28c00 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
28c10 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
28c20 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
28c30 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28c40 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
28c50 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
28c60 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
28c70 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
28c80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28c90 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
28ca0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
28cb0 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
28cc0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
28cd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28ce0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
28cf0 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
28d00 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
28d10 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d30 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
28d40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
28d50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28d60 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
28d70 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
28d80 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
28d90 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
28da0 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
28db0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
28dc0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
28dd0 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
28de0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
28df0 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
28e00 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
28e10 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
28e20 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
28e30 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
28e40 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
28e50 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
28e60 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
28e70 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
28e80 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
28e90 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
28ea0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
28eb0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
28ec0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
28ed0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
28ee0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
28ef0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
28f00 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
28f10 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
28f20 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
28f30 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
28f40 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
28f50 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
28f60 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
28f70 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
28f80 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
28f90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28fa0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
28fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
28fc0 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
28fd0 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
28fe0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
28ff0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
29000 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
29010 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
29020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29030 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
29040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29050 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
29060 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
29070 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
29080 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
29090 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
290a0 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
290b0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
290c0 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
290d0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
290e0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
290f0 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
29100 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
29110 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
29120 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
29130 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
29140 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
29150 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
29160 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
29170 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
29180 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
29190 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
291a0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
291b0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
291c0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
291d0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
291e0 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
291f0 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
29200 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
29210 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
29220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29230 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
29240 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
29250 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
29260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29270 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
29280 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
29290 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
292a0 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
292b0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
292c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
292d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
292e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
292f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
29300 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
29310 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29320 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29330 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
29340 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
29350 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
29360 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
29370 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
29380 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
29390 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
293a0 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
293b0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
293c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
293d0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
293e0 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
293f0 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
29400 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
29410 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
29420 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29430 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
29440 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
29450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
29460 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
29470 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
29480 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
29490 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
294a0 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
294b0 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
294c0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
294d0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
294e0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
294f0 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
29500 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
29510 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
29520 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
29530 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
29540 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
29550 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
29560 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
29570 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
29580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
29590 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
295a0 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
295b0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
295c0 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
295d0 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
295e0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
295f0 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
29600 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
29610 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
29620 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
29630 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
29640 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
29650 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
29660 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
29670 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
29680 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
29690 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
296a0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
296b0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
296c0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
296d0 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
296e0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
296f0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29700 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
29710 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
29720 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
29730 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
29740 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
29750 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
29760 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
29770 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29780 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
29790 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
297a0 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
297b0 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
297c0 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
297d0 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
297e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
297f0 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
29800 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
29810 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
29820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29860 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
29870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29880 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
29890 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
298a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
298c0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
298d0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
298e0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
298f0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
29900 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
29910 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
29920 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
29930 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
29940 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
29950 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
29960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
29970 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
29980 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29990 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
299a0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
299b0 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299d0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
299e0 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
299f0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
29a00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
29a10 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
29a20 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
29a30 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
29a40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29a50 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
29a60 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
29a70 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
29a80 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
29a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
29aa0 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
29ab0 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
29ac0 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
29ad0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
29ae0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
29af0 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
29b00 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
29b10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29b20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29b30 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
29b40 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55  =NULL );..  /* U
29b50 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
29b60 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
29b70 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
29b80 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
29b90 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
29ba0 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
29bb0 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
29bc0 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
29bd0 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
29be0 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
29bf0 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
29c00 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
29c10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29c20 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29c30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29c40 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
29c50 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
29c60 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
29c70 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
29c80 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
29c90 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
29ca0 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
29cb0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
29cc0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
29cd0 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
29ce0 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
29cf0 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
29d00 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
29d10 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
29d20 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26   || (ctrlFlags &
29d30 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
29d40 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  )!=0 );..  OSTRA
29d50 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
29d60 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
29d70 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
29d80 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
29d90 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
29da0 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
29db0 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e  lename;.  pNew->
29dc0 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29  ctrlFlags = (u8)
29dd0 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65  ctrlFlags;.  pNe
29de0 77 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 53  w->mmapLimit = S
29df0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
29e00 41 50 5f 4c 49 4d 49 54 3b 0a 20 20 69 66 28 20  AP_LIMIT;.  if( 
29e10 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
29e20 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
29e30 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
29e40 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
29e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
29e70 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
29e80 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
29e90 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
29ea0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
29eb0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
29ec0 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
29ed0 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
29ee0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
29ef0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
29f00 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
29f10 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
29f20 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
29f30 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
29f40 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
29f50 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
29f60 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
29f70 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
29f80 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
29f90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29fa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
29fb0 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
29fc0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
29fd0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
29fe0 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
29ff0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2a000 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2a010 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2a020 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2a030 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2a040 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2a050 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a060 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2a070 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2a080 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2a090 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2a0a0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2a0b0 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2a0c0 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2a0d0 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2a0e0 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2a0f0 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2a100 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2a110 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2a120 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2a130 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2a140 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2a150 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2a160 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2a170 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2a180 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2a190 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a1a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a1b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a1c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a1d0 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2a1e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2a1f0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2a200 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2a210 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2a220 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2a230 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2a240 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2a250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a260 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2a270 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2a280 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2a290 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2a2a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a2b0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2a2c0 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2a2d0 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2a2e0 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2a2f0 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2a300 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2a310 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2a320 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2a330 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2a340 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2a350 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2a360 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2a370 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2a380 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2a390 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2a3a0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2a3b0 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2a3c0 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2a3d0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2a3e0 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2a3f0 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2a400 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2a410 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2a420 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2a430 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2a440 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2a450 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2a460 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2a470 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2a480 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2a490 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2a4a0 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2a4b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2a4c0 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2a4d0 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2a4e0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2a4f0 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2a500 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2a510 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2a520 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2a530 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2a540 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2a550 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2a560 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2a570 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2a580 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2a590 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2a5a0 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2a5b0 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2a5c0 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2a5d0 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2a5e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2a5f0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2a600 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2a610 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2a620 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2a630 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2a640 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2a650 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2a660 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a670 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2a680 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2a690 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2a6a0 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2a6b0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2a6c0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2a6d0 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2a6e0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2a6f0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2a700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2a710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2a720 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2a730 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2a740 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2a750 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
2a760 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
2a770 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
2a780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2a790 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2a7a0 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2a7b0 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2a7c0 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2a7d0 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2a7e0 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2a7f0 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2a800 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2a810 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2a820 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2a830 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2a840 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2a850 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2a860 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2a870 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2a880 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2a890 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2a8a0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2a8b0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2a8c0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2a8d0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2a8e0 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2a8f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a900 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a910 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2a920 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2a930 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2a940 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2a950 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2a960 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2a970 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2a980 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2a990 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2a9a0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2a9b0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2a9c0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2a9d0 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2a9e0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2a9f0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2aa00 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2aa10 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2aa20 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2aa30 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2aa40 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2aa50 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2aa60 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2aa70 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2aa80 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2aa90 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2aaa0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2aab0 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2aac0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2aad0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e  e3_malloc(nFilen
2aae0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2aaf0 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2ab00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ab10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2ab20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ab30 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2ab40 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2ab50 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2ab60 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2ab70 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2ab80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2ab90 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2aba0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2abb0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2abc0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2abd0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2abe0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2abf0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2ac00 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2ac10 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2ac20 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2ac30 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2ac40 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2ac50 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2ac60 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2ac70 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2ac80 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2ac90 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2aca0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2acb0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2acc0 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2acd0 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2ace0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2acf0 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2ad00 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2ad10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2ad20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2ad30 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2ad40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ad50 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2ad60 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2ad70 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2ad80 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2ad90 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2ada0 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2adb0 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2adc0 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2add0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2ade0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2adf0 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2ae00 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2ae10 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2ae20 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2ae30 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2ae40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ae50 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2ae60 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2ae70 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2ae80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ae90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2aea0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2aeb0 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72  .  pNew->lastErr
2aec0 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56  no = 0;.#if OS_V
2aed0 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2aee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aef0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2af00 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2af10 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2af20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2af30 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2af40 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
2af50 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
2af60 73 44 65 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e  sDelete ) pNew->
2af70 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2af80 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65  XFILE_DELETE;.#e
2af90 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
2afa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2afb0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2afc0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2afd0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
2afe0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
2aff0 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
2b000 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
2b010 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d  Counter(+1);.  }
2b020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b030 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2b040 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2b050 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2b060 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2b070 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2b080 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2b090 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2b0a0 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2b0b0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2b0c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2b0d0 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2b0e0 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2b0f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2b100 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2b110 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2b120 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2b130 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2b140 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2b150 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
2b160 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
2b170 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2b180 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
2b190 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
2b1a0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2b1b0 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
2b1c0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2b1d0 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
2b1e0 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2b1f0 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2b200 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
2b210 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
2b220 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2b230 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
2b240 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
2b250 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
2b260 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2b270 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2b280 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2b290 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
2b2a0 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
2b2b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2b2c0 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
2b2d0 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
2b2e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
2b2f0 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a  return zDir;.}..
2b300 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2b310 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2b320 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2b330 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2b340 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2b350 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2b360 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2b370 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2b380 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2b390 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2b3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b3b0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2b3c0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2b3d0 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2b3e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2b3f0 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
2b400 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
2b410 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
2b420 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2b430 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
2b440 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
2b450 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2b460 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63   i, j;.  const c
2b470 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a  har *zDir;..  /*
2b480 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2b490 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2b4a0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2b4b0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2b4c0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2b4d0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2b4e0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2b4f0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2b500 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2b510 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
2b520 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b530 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b540 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
2b550 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d    zDir = unixTem
2b560 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66  pFileDir();.  if
2b570 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72  ( zDir==0 ) zDir
2b580 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68   = ".";..  /* Ch
2b590 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
2b5a0 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
2b5b0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
2b5c0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
2b5d0 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
2b5e0 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
2b5f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
2b600 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
2b610 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
2b620 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
2b630 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38  ILE_PREFIX) + 18
2b640 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
2b650 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2b660 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b670 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
2b680 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2b690 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73  uf-18, zBuf, "%s
2b6a0 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2b6b0 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
2b6c0 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
2b6d0 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
2b6e0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2b6f0 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
2b700 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2b710 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
2b720 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
2b730 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
2b740 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
2b750 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
2b760 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
2b770 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
2b780 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  = 0;.    zBuf[j+
2b790 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  1] = 0;.  }while
2b7a0 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2b7b0 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2b7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b7d0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2b7e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2b7f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b800 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2b810 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2b820 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2b830 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2b840 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2b850 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2b860 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2b870 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2b880 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2b890 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2b8a0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2b8b0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2b8c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b8d0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2b8e0 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2b8f0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2b900 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2b910 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2b920 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2b930 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2b940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2b950 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2b960 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2b970 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2b980 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2b990 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2b9a0 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2b9b0 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2b9c0 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2b9d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2b9e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2b9f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2ba00 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2ba10 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2ba20 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2ba30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2ba40 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2ba50 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2ba60 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2ba70 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2ba80 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2ba90 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2baa0 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2bab0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2bac0 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2bad0 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2bae0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2baf0 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2bb00 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2bb10 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2bb20 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2bb30 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2bb40 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2bb50 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2bb60 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2bb70 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2bb80 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2bb90 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2bba0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2bbb0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2bbc0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2bbd0 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2bbe0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2bbf0 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2bc00 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2bc10 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2bc20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2bc30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2bc40 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2bc50 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2bc60 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2bc70 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2bc80 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2bc90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2bca0 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2bcb0 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2bcc0 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2bcd0 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2bce0 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2bcf0 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2bd00 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2bd10 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2bd20 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2bd30 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2bd40 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2bd50 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2bd60 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2bd70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2bd80 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2bd90 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2bda0 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2bdb0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2bdc0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bde0 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2bdf0 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2be00 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2be10 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2be20 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2be30 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2be40 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2be50 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2be60 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2be70 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2be80 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2be90 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2bea0 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2beb0 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2bec0 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2bed0 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2bee0 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2bef0 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2bf00 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2bf10 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2bf20 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2bf30 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2bf40 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2bf50 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2bf60 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2bf70 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2bf80 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2bf90 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2bfa0 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2bfb0 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2bfc0 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61  ing for a resusa
2bfd0 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2bfe0 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65  tor are not dire
2bff0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f  .  */.  if( 0==o
2c000 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53  sStat(zPath, &sS
2c010 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  tat) ){.    unix
2c020 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
2c030 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  e;..    unixEnte
2c040 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49  rMutex();.    pI
2c050 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
2c060 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
2c070 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e  ode && (pInode->
2c080 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61  fileId.dev!=sSta
2c090 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20  t.st_dev.       
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2c0b0 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e   pInode->fileId.
2c0c0 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e  ino!=sStat.st_in
2c0d0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e  o) ){.       pIn
2c0e0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
2c0f0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
2c100 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  f( pInode ){.   
2c110 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
2c120 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
2c130 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  pp=&pInode->pUnu
2c140 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70  sed; *pp && (*pp
2c150 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b  )->flags!=flags;
2c160 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
2c170 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75  xt));.      pUnu
2c180 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20  sed = *pp;.     
2c190 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2c1a0 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
2c1b0 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
2c1c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c1d0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c1e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20  ;.  }.#endif    
2c1f0 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
2c200 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
2c210 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
2c220 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2c230 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
2c240 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
2c250 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
2c260 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
2c270 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
2c280 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
2c290 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2c2a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c2b0 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
2c2c0 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
2c2d0 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
2c2e0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
2c2f0 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
2c300 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
2c310 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2c320 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2c330 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2c340 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
2c350 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2c360 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
2c370 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
2c380 6d 6f 73 74 20 63 61 73 65 73 20 63 61 73 65 73  most cases cases
2c390 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
2c3a0 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c  ets *pMode to 0,
2c3b0 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f   which will beco
2c3c0 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74  me.** an indicat
2c3d0 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70  ion to robust_op
2c3e0 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74  en() to create t
2c3f0 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a  he file using.**
2c400 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2c410 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2c420 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65   adjusted by the
2c430 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69   umask..** But i
2c440 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2c450 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
2c460 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
2c470 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
2c480 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2c490 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
2c4a0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2c4b0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
2c4c0 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
2c4d0 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
2c4e0 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
2c4f0 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
2c500 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
2c510 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
2c520 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2c530 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
2c540 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
2c550 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
2c560 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2c570 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2c580 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
2c590 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2c5a0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2c5b0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
2c5c0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
2c5d0 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
2c5e0 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
2c5f0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
2c600 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
2c610 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
2c620 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
2c630 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
2c640 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
2c650 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
2c660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c670 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2c680 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2c690 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2c6a0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2c6b0 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
2c6c0 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
2c6d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
2c700 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
2c710 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
2c720 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
2c730 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c740 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
2c750 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
2c760 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
2c770 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c790 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
2c7a0 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2c7b0 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
2c7e0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2c7f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2c800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2c810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c820 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
2c830 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69  Mode = 0;.  *pUi
2c840 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d  d = 0;.  *pGid =
2c850 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20   0;.  if( flags 
2c860 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2c870 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2c880 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2c890 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
2c8a0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
2c8b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2c8c0 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
2c8d0 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8f0 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
2c900 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
2c910 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2c920 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2c930 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
2c940 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
2c950 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
2c960 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
2c970 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
2c980 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2c990 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2c9a0 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
2c9b0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
2c9c0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2c9d0 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
2c9e0 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
2c9f0 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
2ca00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
2ca10 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
2ca20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2ca30 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2ca40 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
2ca50 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2ca60 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2ca70 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2ca80 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
2ca90 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
2caa0 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
2cab0 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
2cac0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2cad0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2cae0 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2caf0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2cb00 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2cb10 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2cb20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2cb30 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2cb40 31 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1; .#ifdef SQLIT
2cb50 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
2cb60 45 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44  ES.    while( nD
2cb70 62 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  b>0 && sqlite3Is
2cb80 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d  alnum(zPath[nDb]
2cb90 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69  ) ) nDb--;.    i
2cba0 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
2cbb0 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72  th[nDb]!='-' ) r
2cbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cbd0 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
2cbe0 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
2cbf0 27 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ' ){.      asser
2cc00 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20  t( nDb>0 );.    
2cc10 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b    assert( zPath[
2cc20 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20  nDb]!='\n' );.  
2cc30 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
2cc40 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63  .#endif.    memc
2cc50 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
2cc60 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
2cc70 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69  ] = '\0';..    i
2cc80 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62  f( 0==osStat(zDb
2cc90 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2cca0 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
2ccb0 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
2ccc0 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20  ;.      *pUid = 
2ccd0 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20  sStat.st_uid;.  
2cce0 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2ccf0 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65  t.st_gid;.    }e
2cd00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2cd10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2cd20 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
2cd30 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
2cd40 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2cd50 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
2cd60 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
2cd70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cd80 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2cd90 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
2cda0 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
2cdb0 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
2cdc0 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
2cdd0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
2cde0 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
2cdf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
2ce00 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
2ce10 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
2ce20 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
2ce30 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
2ce40 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2ce50 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
2ce60 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
2ce70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
2ce80 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
2ce90 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
2cea0 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
2ceb0 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
2cec0 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
2ced0 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
2cee0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
2cef0 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
2cf00 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
2cf10 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2cf20 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
2cf30 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
2cf40 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
2cf50 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
2cf60 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
2cf70 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
2cf80 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
2cf90 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
2cfa0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2cfb0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
2cfc0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
2cfd0 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
2cfe0 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
2cff0 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
2d000 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
2d010 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
2d020 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
2d030 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
2d040 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
2d050 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
2d060 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
2d070 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2d080 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2d090 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
2d0a0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
2d0b0 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
2d0c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d0d0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2d0e0 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
2d0f0 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
2d100 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2d110 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2d120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
2d130 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
2d140 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
2d150 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d170 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
2d180 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
2d190 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
2d1a0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
2d1b0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2d1c0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2d1d0 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
2d1e0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
2d1f0 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
2d200 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
2d210 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2d220 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2d230 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
2d240 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
2d250 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
2d260 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2d270 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
2d280 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
2d290 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2d2a0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
2d2b0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2d2c0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2d2d0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d2f0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
2d300 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
2d310 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d320 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d330 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2d340 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2d350 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2d360 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d370 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66   /* UNIXFILE_* f
2d380 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  lags */..  int i
2d390 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
2d3a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d3b0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
2d3c0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
2d3d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2d3e0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2d3f0 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
2d400 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
2d410 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d420 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
2d430 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
2d440 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2d450 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2d460 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
2d470 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
2d480 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2d490 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
2d4a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d4b0 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
2d4c0 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
2d4d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2d4e0 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
2d4f0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
2d500 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2d510 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2d520 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75  ING_STYLE.  stru
2d530 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2d540 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
2d550 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
2d560 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
2d570 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
2d580 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
2d590 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
2d5a0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2d5b0 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
2d5c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
2d5d0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
2d5e0 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
2d5f0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
2d600 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
2d610 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
2d620 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
2d630 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72   syncDir = (isCr
2d640 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
2d650 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
2d660 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2d670 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
2d680 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2d690 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
2d6a0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2d6b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
2d6c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
2d6d0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
2d6e0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
2d6f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
2d700 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
2d710 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
2d720 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
2d730 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
2d740 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
2d750 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
2d760 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
2d770 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+2];.  const 
2d780 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
2d790 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
2d7a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2d7b0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
2d7c0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
2d7d0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
2d7e0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
2d7f0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
2d800 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
2d810 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
2d820 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
2d830 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
2d840 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2d850 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
2d860 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
2d870 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2d880 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2d890 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
2d8a0 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
2d8b0 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
2d8c0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
2d8d0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
2d8e0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
2d8f0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
2d900 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
2d910 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
2d920 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
2d930 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
2d940 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
2d950 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
2d960 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
2d970 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
2d980 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
2d990 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
2d9a0 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
2d9b0 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
2d9c0 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
2d9d0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
2d9e0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2d9f0 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
2da00 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
2da10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
2da20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
2da30 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2da40 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2da50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2da60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2da70 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2da80 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2da90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2daa0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2dab0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2dac0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2dad0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2dae0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
2daf0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2db00 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2db10 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2db20 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
2db30 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
2db40 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
2db50 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
2db60 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
2db70 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
2db80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2db90 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
2dba0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2dbb0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
2dbc0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
2dbd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2dbe0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
2dbf0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2dc00 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
2dc10 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2dc20 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
2dc30 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
2dc40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2dc50 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2dc60 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2dc70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
2dc80 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
2dc90 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2dca0 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  L.  );..  memset
2dcb0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
2dcc0 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
2dcd0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2dce0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
2dcf0 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
2dd00 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
2dd10 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
2dd20 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
2dd30 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
2dd40 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
2dd50 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
2dd60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dd70 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
2dd80 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2dd90 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
2dda0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
2ddb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2ddc0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2ddd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dde0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
2ddf0 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a  pUnused;..    /*
2de00 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
2de10 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
2de20 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
2de30 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
2de40 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20     ** URIs with 
2de50 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
2de60 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
2de70 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
2de80 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
2de90 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2dea0 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2deb0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
2dec0 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a  E_OPEN_URI) || z
2ded0 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
2dee0 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d  e)+1]==0 );..  }
2def0 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
2df00 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
2df10 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
2df20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
2df30 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
2df40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
2df50 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
2df60 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20   !syncDir);.    
2df70 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
2df80 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
2df90 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+2, zTmpname);.
2dfa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dfb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2dfc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2dfd0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
2dfe0 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  name;..    /* Ge
2dff0 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72  nerated temporar
2e000 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  y filenames are 
2e010 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65  always double-ze
2e020 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  ro terminated.  
2e030 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20    ** for use by 
2e040 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
2e050 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20  meter(). */.    
2e060 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74  assert( zName[st
2e070 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2e080 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  0 );.  }..  /* D
2e090 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
2e0a0 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
2e0b0 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
2e0c0 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
2e0d0 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
2e0e0 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
2e0f0 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
2e100 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
2e110 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
2e120 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
2e130 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2e140 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
2e150 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
2e160 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
2e170 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
2e180 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
2e190 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
2e1a0 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
2e1b0 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
2e1c0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
2e1d0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2e1e0 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
2e1f0 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
2e200 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
2e210 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
2e220 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
2e230 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
2e240 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
2e250 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
2e260 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
2e270 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
2e280 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20  de_t openMode;  
2e290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e2a0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72  ermissions to cr
2e2b0 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a  eate file with *
2e2c0 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b  /.    uid_t uid;
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2e0 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f      /* Userid fo
2e2f0 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
2e300 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e320 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
2e330 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
2e340 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
2e350 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
2e360 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
2e370 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20  &uid, &gid);.   
2e380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2e3a0 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
2e3b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e3c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e3d0 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
2e3e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e3f0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2e400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e410 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
2e420 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2e430 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2e440 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
2e450 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
2e460 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
2e470 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
2e480 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
2e490 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
2e4a0 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
2e4b0 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
2e4c0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
2e4d0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
2e4e0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
2e4f0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
2e500 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
2e510 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
2e520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e530 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2e540 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
2e550 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
2e560 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
2e570 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
2e580 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e590 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
2e5a0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2e5b0 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
2e5c0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
2e5d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2e5e0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
2e5f0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
2e600 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
2e610 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2e620 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2e630 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2e640 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
2e650 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
2e660 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
2e670 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2e680 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
2e690 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  ing as root and 
2e6a0 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  if creating a ne
2e6b0 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  w rollback.    *
2e6c0 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  * journal or WAL
2e6d0 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f   file, set the o
2e6e0 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
2e6f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74  journal or WAL t
2e700 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  o be.    ** the 
2e710 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67  same as the orig
2e720 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
2e730 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c     */.    if( fl
2e740 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2e750 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2e760 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2e770 20 29 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   ){.      osFcho
2e780 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29  wn(fd, uid, gid)
2e790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
2e7a0 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
2e7b0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
2e7c0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
2e7d0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2e7e0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
2e7f0 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
2e800 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
2e810 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
2e820 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
2e830 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2e840 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2e850 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
2e860 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73  me;.#else.    os
2e870 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
2e880 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
2e890 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e8a0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
2e8b0 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
2e8c0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2e8d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f    }.#endif..  no
2e8e0 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51  Lock = eType!=SQ
2e8f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2e900 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  B;..  .#if defin
2e910 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
2e920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e930 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2e940 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
2e950 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2e960 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2e970 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
2e980 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2e990 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2e9a0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2e9b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e9c0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2e9d0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
2e9e0 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
2e9f0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2ea00 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
2ea10 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2ea20 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
2ea30 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
2ea40 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
2ea50 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70  ..  /* Set up ap
2ea60 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c  propriate ctrlFl
2ea70 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ags */.  if( isD
2ea80 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20  elete )         
2ea90 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2eaa0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
2eab0 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61  ETE;.  if( isRea
2eac0 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20  donly )         
2ead0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2eae0 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  = UNIXFILE_RDONL
2eaf0 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  Y;.  if( noLock 
2eb00 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2eb10 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2eb20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2eb30 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29  .  if( syncDir )
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2eb60 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
2eb70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
2eb80 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20  LITE_OPEN_URI ) 
2eb90 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2eba0 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20  XFILE_URI;..#if 
2ebb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ebc0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2ebd0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2ebe0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2ebf0 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2ec00 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2ec10 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2ec20 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2ec30 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2ec40 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2ec50 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2ec60 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2ec70 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2ec80 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2ec90 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2eca0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2ecb0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2ecc0 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2ecd0 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2ece0 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2ecf0 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2ed00 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2ed10 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2ed20 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2ed30 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2ed40 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2ed50 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2ed60 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2ed70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2ed80 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
2ed90 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2eda0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
2edb0 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
2edc0 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
2edd0 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
2ede0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
2edf0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
2ee00 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
2ee10 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
2ee20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
2ee30 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
2ee40 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
2ee50 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
2ee60 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
2ee70 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
2ee80 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
2ee90 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
2eea0 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
2eeb0 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
2eec0 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
2eed0 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
2eee0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
2eef0 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
2ef00 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
2ef10 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
2ef20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
2ef30 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2ef40 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
2ef50 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
2ef60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2ef70 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
2ef80 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
2ef90 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
2efa0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
2efb0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2efc0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2efd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2efe0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2eff0 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
2f000 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2f010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
2f020 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
2f030 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
2f040 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
2f050 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
2f060 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
2f070 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2f080 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
2f090 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20   ctrlFlags);.   
2f0a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f0b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f0c0 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
2f0d0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
2f0e0 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
2f0f0 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
2f100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f110 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f120 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
2f130 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
2f140 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
2f150 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
2f160 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
2f170 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
2f180 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
2f190 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
2f1a0 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
2f1b0 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
2f1c0 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
2f1d0 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
2f1e0 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
2f1f0 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
2f200 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2f210 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
2f220 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f230 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2f240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
2f250 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2f260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2f270 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
2f280 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
2f290 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
2f2a0 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
2f2b0 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
2f2c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2f2e0 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
2f2f0 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
2f300 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f310 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2f320 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2f330 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2f340 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
2f350 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
2f360 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
2f370 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
2f380 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
2f390 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2f3a0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2f3b0 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
2f3c0 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
2f3d0 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
2f3e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2f3f0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
2f400 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2f410 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2f420 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
2f430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f440 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
2f450 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2f460 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
2f470 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2f480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
2f490 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2f4a0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2f4b0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2f4c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2f4d0 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
2f4e0 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
2f4f0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  ) ){.    if( err
2f500 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
2f510 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f520 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
2f530 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
2f540 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2f550 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2f560 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
2f570 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
2f580 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
2f590 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
2f5a0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
2f5b0 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
2f5c0 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
2f5d0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
2f5e0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
2f5f0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
2f600 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
2f620 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
2f630 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
2f640 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
2f650 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
2f660 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
2f670 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2f680 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2f690 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
2f6a0 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
2f6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f6c0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2f6d0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2f6e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2f6f0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2f700 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2f710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f720 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2f730 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f740 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65   Test the existe
2f750 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
2f760 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2f770 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
2f780 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
2f790 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
2f7a0 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
2f7b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
2f7c0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
2f7d0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2f7e0 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
2f7f0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2f800 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
2f810 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2f820 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
2f830 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
2f840 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2f850 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
2f860 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2f870 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
2f880 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2f890 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
2f8a0 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
2f8b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2f8c0 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
2f8d0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2f8e0 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
2f8f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2f900 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
2f910 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
2f920 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
2f930 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2f940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2f950 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
2f960 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
2f970 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2f980 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2f990 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2f9a0 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2f9b0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2f9c0 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2f9d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f9e0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2f9f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2fa00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2fa10 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2fa20 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2fa30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2fa40 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2fa50 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2fa60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2fa70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2fa80 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2fa90 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2faa0 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2fab0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2fac0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2fad0 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2fae0 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2faf0 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2fb00 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2fb10 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2fb20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2fb30 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2fb40 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2fb50 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2fb60 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2fb70 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2fb80 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2fb90 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2fba0 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2fbb0 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
2fbc0 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
2fbd0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
2fbe0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
2fbf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2fc00 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
2fc10 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
2fc20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
2fc30 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
2fc40 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
2fc50 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
2fc60 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2fc70 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
2fc80 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
2fc90 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
2fca0 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
2fcb0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
2fcc0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
2fcd0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
2fce0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
2fcf0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
2fd00 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
2fd10 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
2fd20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
2fd30 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
2fd40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
2fd50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
2fd60 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2fd70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2fd90 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2fda0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2fdb0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2fdc0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2fdd0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2fde0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2fdf0 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
2fe00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2fe10 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2fe20 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2fe30 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe50 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2fe60 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
2fe70 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2fe80 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2fe90 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2fea0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2feb0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2fec0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2fed0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2fee0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2fef0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2ff00 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2ff10 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2ff20 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2ff30 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2ff40 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2ff50 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2ff60 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2ff70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2ff80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2ff90 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
2ffa0 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
2ffb0 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
2ffc0 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
2ffd0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2ffe0 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
2fff0 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
30000 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
30010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30020 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
30030 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
30040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
30050 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73  nCwd;.    if( os
30060 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
30070 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
30080 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
30090 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
300a0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
300b0 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
300c0 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
300d0 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
300e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
300f0 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
30100 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
30110 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
30120 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30130 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
30140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
30150 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
30160 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
30170 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
30180 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
30190 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
301a0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
301b0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
301c0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
301d0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
301e0 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
301f0 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
30200 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
30210 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30220 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
30230 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
30240 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30250 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
30260 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
30270 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
30280 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
30290 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
302a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
302b0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
302c0 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
302d0 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
302e0 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
302f0 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
30300 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
30310 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
30320 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
30330 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
30340 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
30350 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
30360 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
30370 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
30380 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
30390 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
303a0 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
303b0 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
303c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
303d0 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
303e0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
303f0 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
30400 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
30410 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
30420 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30430 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
30440 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
30450 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
30460 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
30470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30480 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
30490 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
304a0 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
304b0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
304c0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
304d0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
304e0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
304f0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
30500 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
30510 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
30520 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
30530 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
30540 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
30550 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
30560 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
30570 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
30580 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
30590 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
305a0 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
305b0 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
305c0 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
305d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
305e0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
305f0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
30600 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
30610 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
30620 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
30630 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
30640 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
30650 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
30660 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
30670 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
30680 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
30690 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
306a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
306b0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
306c0 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
306d0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
306e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
306f0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
30700 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
30710 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
30720 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
30730 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
30740 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
30750 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
30760 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
30770 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
30780 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
30790 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
307a0 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
307b0 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
307c0 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
307d0 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
307e0 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
307f0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
30800 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
30810 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
30820 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
30830 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
30840 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
30850 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
30860 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
30870 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
30880 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
30890 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
308a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
308b0 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
308c0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
308d0 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
308e0 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
308f0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
30900 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
30910 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30920 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
30930 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
30940 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
30950 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
30960 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
30970 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
30980 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
30990 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
309a0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
309b0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
309c0 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
309d0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
309e0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
309f0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
30a00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
30a10 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
30a20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
30a30 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
30a40 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
30a50 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
30a60 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
30a70 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
30a80 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
30a90 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
30aa0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
30ab0 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
30ac0 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
30ad0 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
30ae0 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
30af0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
30b00 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
30b10 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
30b20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
30b30 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
30b40 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
30b50 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
30b60 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
30b70 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
30b80 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
30b90 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
30ba0 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
30bb0 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
30bc0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
30bd0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
30be0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
30bf0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
30c00 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
30c10 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
30c20 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
30c30 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
30c40 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
30c50 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
30c60 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
30c70 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
30c80 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
30c90 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
30ca0 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
30cb0 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
30cc0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
30cd0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
30ce0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
30cf0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
30d00 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
30d10 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
30d20 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
30d30 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
30d40 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
30d50 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
30d60 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
30d70 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
30d80 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
30d90 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c      int pid, fd,
30da0 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72   got;.    fd = r
30db0 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
30dc0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
30dd0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
30de0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
30df0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
30e00 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
30e10 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
30e20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
30e30 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
30e40 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
30e50 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
30e60 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
30e70 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
30e80 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
30e90 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
30ea0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
30eb0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
30ec0 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
30ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30ee0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
30ef0 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
30f00 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
30f10 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
30f20 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
30f30 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
30f40 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
30f50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
30f60 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
30f70 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
30f80 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
30f90 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
30fa0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
30fb0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
30fc0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
30fd0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
30fe0 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
30ff0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
31000 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
31010 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
31020 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
31030 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
31040 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
31050 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
31060 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
31070 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
31080 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
31090 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
310a0 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
310b0 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
310c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
310d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
310e0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
310f0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
31100 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
31110 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
31120 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
31130 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
31140 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
31150 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
31160 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
31170 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
31180 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
31190 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
311a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
311b0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
311c0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
311d0 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  ds;.#elif define
311e0 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
311f0 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
31200 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
31210 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
31220 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31230 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
31240 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
31250 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
31260 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
31270 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
31280 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
31290 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
312a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
312b0 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
312c0 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
312d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
312e0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
312f0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
31300 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
31310 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
31320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
31330 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
31340 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
31350 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
31360 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
31370 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
31380 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
31390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
313a0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
313b0 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
313c0 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
313d0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
313e0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
313f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
31400 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
31410 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
31420 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
31430 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
31440 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
31450 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
31460 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
31470 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
31480 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
31490 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
314a0 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
314b0 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
314c0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
314d0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
314e0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
314f0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
31500 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
31510 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
31520 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
31530 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
31540 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
31550 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
31560 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
31570 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31580 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
31590 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
315a0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
315b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
315c0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
315d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
315e0 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
315f0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
31600 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
31610 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
31620 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
31630 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
31640 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d  0000;.  int rc =
31650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20   SQLITE_OK;.#if 
31660 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
31670 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
31680 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
31690 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
316a0 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
316b0 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
316c0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
316d0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
316e0 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
316f0 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
31700 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
31710 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
31720 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
31730 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
31740 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
31750 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
31760 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
31770 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65  l sNow;.  if( ge
31780 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
31790 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  , 0)==0 ){.    *
317a0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
317b0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
317c0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
317d0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
317e0 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65  ec/1000;.  }else
317f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
31800 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
31810 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
31820 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
31830 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
31840 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
31850 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
31860 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
31870 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
31880 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
31890 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
318a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
318b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
318c0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
318d0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
318e0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
318f0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
31900 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
31910 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
31920 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
31930 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
31940 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
31950 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
31960 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
31970 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
31980 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
31990 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
319a0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
319b0 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
319c0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
319d0 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
319e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
319f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31a00 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
31a10 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
31a20 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
31a30 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
31a40 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
31a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  ;.}../*.** We ad
31a60 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
31a70 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
31a80 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
31a90 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
31aa0 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
31ab0 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
31ac0 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
31ad0 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
31ae0 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
31af0 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
31b00 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
31b10 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
31b20 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
31b30 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
31b40 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
31b50 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
31b60 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
31b70 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
31b80 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
31b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31ba0 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
31bb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31bc0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
31bd0 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
31be0 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
31bf0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31c00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31c10 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
31c20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31c30 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
31c40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
31c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31c60 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
31c70 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
31c80 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
31c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
31ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
31cf0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
31d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
31d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
31d60 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
31d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31d90 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
31da0 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
31db0 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
31dc0 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
31dd0 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
31de0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
31df0 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
31e00 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
31e10 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
31e20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
31e30 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
31e40 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
31e50 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
31e60 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
31e70 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
31e80 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
31e90 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
31ea0 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
31eb0 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
31ec0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
31ed0 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
31ee0 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
31ef0 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
31f00 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
31f10 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
31f20 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
31f30 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
31f40 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
31f50 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
31f60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
31f70 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
31f80 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
31f90 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
31fa0 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
31fb0 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
31fc0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
31fd0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
31fe0 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
31ff0 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
32000 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
32010 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
32020 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
32030 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
32040 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
32050 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
32060 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
32070 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
32080 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
32090 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
320a0 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
320b0 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
320c0 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
320d0 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
320e0 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
320f0 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
32100 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
32110 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
32120 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
32130 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
32140 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
32150 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
32160 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
32170 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
32180 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
32190 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
321a0 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
321b0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
321c0 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
321d0 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
321e0 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
321f0 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
32200 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
32210 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
32220 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
32230 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
32240 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
32250 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
32260 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
32270 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20   0x40000000.**  
32280 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
32290 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
322a0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
322b0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
322c0 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
322d0 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
322e0 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
322f0 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
32300 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
32310 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
32320 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
32330 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
32340 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
32350 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
32360 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
32370 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
32380 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
32390 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
323a0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
323b0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
323c0 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
323d0 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
323e0 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
323f0 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
32400 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
32410 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
32420 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
32430 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
32440 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
32450 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
32460 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
32470 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
32480 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
32490 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
324a0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
324b0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
324c0 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
324d0 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
324e0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
324f0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
32500 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
32510 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
32520 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
32530 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
32540 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
32550 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
32560 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
32570 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
32580 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
32590 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
325a0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
325b0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
325c0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
325d0 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
325e0 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
325f0 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
32600 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
32610 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
32620 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
32630 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
32640 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
32650 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
32660 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
32670 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
32680 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
32690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
326a0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
326b0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
326c0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
326d0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
326e0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
326f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
32700 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
32710 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
32720 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
32730 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
32740 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
32750 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
32760 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
32770 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
32780 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
32790 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
327a0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
327b0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
327c0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
327d0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
327e0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
327f0 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
32800 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
32810 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
32820 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
32830 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
32840 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
32850 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
32860 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
32870 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
32880 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
32890 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
328a0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
328b0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
328c0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
328d0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
328e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
328f0 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
32900 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
32910 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
32920 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
32930 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
32940 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
32950 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
32960 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
32970 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
32980 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
32990 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
329a0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
329b0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
329c0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
329d0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
329e0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
329f0 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
32a00 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
32a10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
32a20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
32a30 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
32a40 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
32a50 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
32a60 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
32a70 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
32a80 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
32a90 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
32aa0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
32ab0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
32ac0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
32ad0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
32ae0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
32af0 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
32b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
32b10 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
32b20 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
32b30 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
32b40 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
32b50 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
32b60 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
32b70 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
32b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32b90 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
32ba0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
32bb0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
32bc0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
32bd0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
32be0 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
32bf0 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
32c00 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
32c10 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
32c20 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
32c30 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
32c40 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
32c50 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
32c60 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
32c70 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
32c80 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
32c90 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
32ca0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
32cb0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
32cc0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
32cd0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
32ce0 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
32cf0 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
32d00 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
32d10 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
32d20 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
32d30 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
32d40 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
32d50 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
32d60 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
32d70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32d80 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
32d90 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
32da0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
32db0 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
32dc0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
32dd0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
32de0 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
32df0 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
32e00 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
32e10 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
32e20 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
32e30 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
32e40 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
32e50 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
32e60 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
32e70 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
32e80 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
32e90 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
32ea0 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
32eb0 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
32ec0 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
32ed0 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
32ee0 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
32ef0 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
32f00 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
32f10 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
32f20 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
32f30 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
32f40 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
32f50 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
32f60 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
32f70 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
32f80 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
32f90 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
32fa0 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
32fb0 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
32fc0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
32fd0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
32fe0 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
32ff0 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
33000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33010 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
33020 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
33030 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
33040 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
33050 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
33060 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
33070 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
33080 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
33090 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
330a0 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
330b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
330c0 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
330d0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
330e0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
330f0 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
33100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
33110 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
33120 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
33130 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
33140 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
33150 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
33160 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
33170 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
33180 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
33190 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
331a0 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
331b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
331c0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
331d0 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
331e0 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
331f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
33200 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33210 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
33220 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
33230 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
33240 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
33250 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
33260 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
33270 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
33280 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
33290 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
332a0 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
332b0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
332c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
332d0 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
332e0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
332f0 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
33300 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
33310 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
33320 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
33330 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
33340 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
33350 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
33360 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
33370 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
33380 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
33390 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
333a0 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
333b0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
333c0 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
333d0 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
333e0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
333f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
33400 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
33410 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
33420 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
33430 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
33440 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
33450 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
33460 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
33470 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
33480 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
33490 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
334a0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
334b0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
334c0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
334d0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
334e0 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
334f0 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
33500 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
33510 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
33520 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
33530 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
33540 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
33550 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
33560 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
33570 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
33580 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
33590 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
335a0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
335b0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
335c0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
335d0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
335e0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
335f0 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
33600 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
33610 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
33620 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
33630 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
33640 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
33650 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
33660 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
33670 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
33680 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
33690 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
336a0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
336b0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
336c0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
336d0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
336e0 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
336f0 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
33700 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
33710 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
33720 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
33730 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
33740 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
33750 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
33760 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
33770 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
33780 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
33790 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
337a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
337b0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
337c0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
337d0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
337e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
337f0 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
33800 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
33810 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
33820 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
33830 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
33840 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
33850 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33860 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
33870 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
33880 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33890 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
338a0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
338b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
338c0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
338d0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
338e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
338f0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
33900 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
33910 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
33920 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
33930 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
33940 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
33950 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
33960 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
33970 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
33980 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
339b0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
339c0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
339d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
339e0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
339f0 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
33a00 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
33a10 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
33a20 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
33a30 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
33a40 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
33a50 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
33a60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
33a70 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
33a80 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
33a90 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
33aa0 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
33ab0 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
33ac0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
33ad0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
33ae0 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
33af0 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
33b00 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
33b10 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
33b20 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
33b30 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
33b40 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
33b50 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
33b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33b70 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
33b80 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
33b90 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
33ba0 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
33bb0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
33bc0 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
33bd0 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
33be0 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
33bf0 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
33c00 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
33c10 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
33c20 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
33c30 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
33c40 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
33c50 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
33c60 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
33c70 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
33c80 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
33c90 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
33ca0 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
33cb0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
33cc0 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
33cd0 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  o, getpid()));. 
33ce0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33cf0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
33d00 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
33d10 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
33d20 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
33d30 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
33d40 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
33d50 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
33d60 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
33d70 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
33d80 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
33d90 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
33da0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
33db0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
33dc0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
33dd0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
33de0 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
33df0 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
33e00 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
33e10 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
33e20 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
33e30 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
33e40 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
33e50 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
33e60 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
33e70 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
33e80 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
33e90 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
33ea0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
33eb0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
33ec0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
33ed0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
33ee0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
33ef0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
33f00 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
33f10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
33f20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
33f30 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
33f40 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
33f50 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
33f60 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
33f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
33f80 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
33f90 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
33fa0 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
33fb0 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
33fc0 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
33fd0 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
33fe0 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
33ff0 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
34000 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
34010 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
34020 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
34030 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
34040 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
34050 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
34060 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
34070 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
34080 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
34090 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
340a0 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
340b0 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
340c0 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
340d0 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
340e0 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
340f0 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
34100 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
34110 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
34120 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
34130 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
34140 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
34150 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
34160 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
34170 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
34180 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
34190 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
341a0 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62     if( osMkdir(b
341b0 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  uf, SQLITE_DEFAU
341c0 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
341d0 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
341e0 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
341f0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rno;.          i
34200 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
34210 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
34220 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
34230 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20  OCKPATH  FAILED 
34240 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20  creating %s, ". 
34250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34260 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20      "'%s' proxy 
34270 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
34280 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
34290 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
342a0 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c  , strerror(err),
342b0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
342c0 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  d()));.         
342d0 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20     return err;. 
342e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
342f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34300 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20     start=i+1;.  
34310 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d    }.    buf[i] =
34320 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20   lockPath[i];.  
34330 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52  }.  OSTRACE(("CR
34340 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72  EATELOCKPATH  pr
34350 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
34360 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b   pid=%d\n", lock
34370 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
34380 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
34390 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
343a0 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
343b0 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
343c0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
343d0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
343e0 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
343f0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
34400 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
34410 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
34420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
34430 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
34440 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
34450 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
34460 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
34470 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
34480 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
34490 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
344a0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
344b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
344c0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
344d0 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
344e0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
344f0 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
34500 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
34510 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
34520 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
34530 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
34540 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
34550 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
34560 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
34570 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
34580 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
34590 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
345a0 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
345b0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
345c0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
345d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
345e0 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
345f0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
34600 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
34610 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
34620 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
34630 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
34640 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
34650 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
34660 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
34670 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
34680 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
34690 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
346a0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
346b0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
346c0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
346d0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
346e0 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
346f0 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
34700 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
34710 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
34720 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
34730 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
34740 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
34750 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
34760 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
34770 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
34780 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
34790 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
347a0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
347b0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
347c0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
347d0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
347e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
347f0 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
34800 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
34810 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
34820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34830 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
34840 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
34850 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
34860 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
34870 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
34880 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
34890 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
348a0 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
348b0 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
348c0 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
348d0 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
348e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
348f0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
34900 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
34910 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
34920 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
34930 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
34940 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
34950 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
34960 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
34970 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
34980 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
34990 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
349a0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
349b0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
349c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
349d0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
349e0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
349f0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
34a00 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
34a10 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
34a20 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
34a30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34a40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
34a50 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
34a60 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
34a70 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
34a80 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
34a90 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
34aa0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
34ab0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
34ac0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
34ad0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
34ae0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
34af0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
34b00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
34b10 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
34b20 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
34b30 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
34b40 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
34b50 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
34b60 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
34b70 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
34b80 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
34b90 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
34ba0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
34bb0 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
34bc0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
34bd0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
34be0 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
34bf0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
34c00 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
34c10 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
34c20 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
34c30 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
34c40 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
34c50 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
34c60 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
34c70 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29  *)pNew, path, 0)
34c80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
34ca0 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
34cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34cc0 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
34cd0 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72  e_proxy:    .  r
34ce0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
34cf0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
34d00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
34d10 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  pNew);.  sqlite3
34d20 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a  _free(pUnused);.
34d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34d40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
34d50 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
34d60 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
34d70 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
34d80 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
34d90 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
34da0 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
34db0 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
34dc0 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  e PROXY_HOSTIDLE
34dd0 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63  N    16  /* conc
34de0 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c  h file host id l
34df0 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74  ength */../* Not
34e00 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20   always defined 
34e10 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61  in the headers a
34e20 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  s it ought to be
34e30 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67   */.extern int g
34e40 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f  ethostuuid(uuid_
34e50 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75  t id, const stru
34e60 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69  ct timespec *wai
34e70 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  t);../* get the 
34e80 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68  host ID via geth
34e90 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74  ostuuid(), pHost
34ea0 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ID must point to
34eb0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
34ec0 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72   .** bytes of wr
34ed0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  itable memory..*
34ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34ef0 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69  xyGetHostID(unsi
34f00 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74  gned char *pHost
34f10 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
34f20 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59  {.  assert(PROXY
34f30 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69  _HOSTIDLEN == si
34f40 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20  zeof(uuid_t));. 
34f50 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c   memset(pHostID,
34f60 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   0, PROXY_HOSTID
34f70 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  LEN);.#if define
34f80 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52  d(__MAX_OS_X_VER
34f90 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
34fa0 44 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  D)\.            
34fb0 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58     && __MAC_OS_X
34fc0 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
34fd0 55 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20  UIRED<1050.  {. 
34fe0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
34ff0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
35000 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d  timeout = {1, 0}
35010 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f  ; /* 1 sec timeo
35020 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  ut */.    if( ge
35030 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49  thostuuid(pHostI
35040 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a  D, &timeout) ){.
35050 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
35060 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
35070 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
35080 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
35090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
350a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
350b0 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
350c0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
350d0 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b  RAMETER(pError);
350e0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
350f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
35100 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
35110 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
35120 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
35130 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
35140 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f    if( sqlite3_ho
35150 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a  stid_num != 0){.
35160 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d      pHostID[0] =
35170 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b   (char)(pHostID[
35180 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69  0] + (char)(sqli
35190 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26  te3_hostid_num &
351a0 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e   0xFF));.  }.#en
351b0 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  dif.  .  return 
351c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
351d0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
351e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61  contains the hea
351f0 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64  der, host id and
35200 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
35210 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
35220 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32  Y_CONCHVERSION 2
35230 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61     /* 1-byte hea
35240 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73  der, 16-byte hos
35250 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64  t id, path */.#d
35260 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44  efine PROXY_HEAD
35270 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20  ERLEN    1   /* 
35280 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65  conch file heade
35290 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66  r length */.#def
352a0 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  ine PROXY_PATHIN
352b0 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45  DEX    (PROXY_HE
352c0 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
352d0 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65  STIDLEN).#define
352e0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
352f0 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45  EN  (PROXY_HEADE
35300 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
35310 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29  DLEN+MAXPATHLEN)
35320 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61  ../* .** Takes a
35330 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  n open conch fil
35340 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f  e, copies the co
35350 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20  ntents to a new 
35360 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f  path and then mo
35370 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e  ves .** it back.
35380 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61    The newly crea
35390 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20  ted file's file 
353a0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73  descriptor is as
353b0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a  signed to the.**
353c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75   conch file stru
353d0 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c  cture and finall
353e0 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  y the original c
353f0 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  onch file descri
35400 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73  ptor is .** clos
35410 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72  ed.  Returns zer
35420 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  o if successful.
35430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35440 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
35450 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
35460 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
35470 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  tID){.  proxyLoc
35480 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
35490 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
354a0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
354b0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
354c0 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
354d0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
354e0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68  >conchFile;.  ch
354f0 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48  ar tPath[MAXPATH
35500 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66  LEN];.  char buf
35510 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
35520 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61  EN];.  char *cPa
35530 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  th = pCtx->conch
35540 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65  FilePath;.  size
35550 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  _t readLen = 0;.
35560 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
35570 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72   = 0;.  char err
35580 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20  msg[64] = "";.  
35590 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
355a0 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e  nt rc = -1;.  UN
355b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
355c0 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20  yHostID);..  /* 
355d0 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74  create a new pat
355e0 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65  h by replace the
355f0 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63   trailing '-conc
35600 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27  h' with '-break'
35610 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20   */.  pathLen = 
35620 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63  strlcpy(tPath, c
35630 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
35640 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e  );.  if( pathLen
35650 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70  >MAXPATHLEN || p
35660 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20  athLen<6 || .   
35670 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74    (strlcpy(&tPat
35680 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62  h[pathLen-5], "b
35690 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20  reak", 6) != 5) 
356a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
356b0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
356c0 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70  rrmsg),errmsg,"p
356d0 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ath error (len %
356e0 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e  d)",(int)pathLen
356f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
35700 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
35710 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e   /* read the con
35720 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ch content */.  
35730 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61  readLen = osPrea
35740 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
35750 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
35760 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
35770 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
35780 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
35790 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
357a0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
357b0 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72  ,errmsg,"read er
357c0 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
357d0 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20  nt)readLen);.   
357e0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
357f0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72  ock;.  }.  /* wr
35800 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
35810 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61  e temporary brea
35820 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d  k file */.  fd =
35830 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61   robust_open(tPa
35840 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
35850 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b  EAT|O_EXCL), 0);
35860 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
35870 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35880 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
35890 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
358a0 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
358b0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
358c0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
358d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
358e0 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
358f0 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
35900 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
35910 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35920 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
35930 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
35940 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
35950 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
35960 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
35970 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
35980 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
35990 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
359a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
359b0 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
359c0 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
359d0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
359e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
359f0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
35a00 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
35a10 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
35a20 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
35a30 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
35a40 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
35a50 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
35a60 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
35a70 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
35a80 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
35a90 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
35aa0 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
35ab0 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
35ac0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
35ad0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
35ae0 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
35af0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
35b00 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
35b10 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
35b20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
35b30 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
35b40 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
35b50 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
35b60 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
35b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35b80 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
35b90 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
35ba0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
35bb0 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
35bc0 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
35bd0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
35be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35bf0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
35c00 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
35c10 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
35c20 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
35c30 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35c40 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
35c50 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35c60 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
35c70 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
35c80 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35c90 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
35ca0 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
35cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35cc0 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
35cd0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
35ce0 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
35cf0 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f   memset(&conchMo
35d00 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  dTime, 0, sizeof
35d10 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b  (conchModTime));
35d20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
35d30 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
35d40 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
35d50 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
35d60 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
35d70 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
35d80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35d90 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
35da0 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
35db0 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
35dc0 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
35dd0 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
35de0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
35df0 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
35e00 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
35e10 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
35e20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
35e30 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
35e40 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
35e50 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
35e60 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
35e70 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
35e80 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
35e90 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
35ea0 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
35eb0 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
35ec0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
35ed0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
35ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
35ef0 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
35f00 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
35f10 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
35f20 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
35f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35f40 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
35f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
35f60 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
35f70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
35f80 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
35f90 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
35fa0 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
35fb0 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
35fc0 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
35fd0 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
35fe0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
35ff0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
36000 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
36010 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
36020 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
36030 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
36040 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
36050 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
36060 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
36070 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
36080 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
36090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
360a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
360b0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
360c0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
360d0 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
360e0 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
360f0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
36100 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
36110 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
36120 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
36130 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
36140 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
36150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
36160 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
36170 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
36180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36190 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
361a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
361b0 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
361c0 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
361d0 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
361e0 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
361f0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
36200 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
36210 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
36220 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
36230 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
36240 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
36250 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
36260 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
36270 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
36280 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36290 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
362a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
362b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
362c0 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
362d0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
362e0 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
362f0 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
36300 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36310 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
36320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36330 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
36340 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
36350 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
36360 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
36370 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
36380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
36390 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
363a0 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
363b0 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
363c0 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
363d0 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
363e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
363f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
36400 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
36410 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
36420 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
36430 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
36440 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
36450 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
36460 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
36470 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
36480 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
36490 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
364a0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
364b0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
364c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
364d0 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
364e0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
364f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
36500 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
36510 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
36520 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
36530 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
36540 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
36550 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
36560 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
36570 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
36580 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
36590 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
365a0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
365b0 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
365c0 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
365d0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
365e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
365f0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
36600 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
36610 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
36620 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
36630 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
36640 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
36650 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
36660 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
36670 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
36680 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
36690 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
366a0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
366b0 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
366c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
366d0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
366e0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
366f0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36700 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
36710 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
36720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36730 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
36740 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
36750 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
36760 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
36770 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
36780 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
36790 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
367a0 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
367b0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
367c0 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
367d0 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
367e0 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
367f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
36800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36810 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
36820 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
36830 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
36840 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
36850 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
36860 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
36870 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
36880 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
36890 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
368a0 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
368b0 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
368c0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
368d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
368e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
368f0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
36900 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
36910 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
36920 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
36930 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
36940 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
36950 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
36960 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
36970 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
36980 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
36990 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
369a0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
369b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
369c0 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
369d0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
369e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
369f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36a00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
36a10 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
36a20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
36a30 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
36a40 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
36a50 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
36a60 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
36a70 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
36a80 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
36a90 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
36aa0 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
36ab0 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
36ac0 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
36ad0 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
36ae0 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
36af0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
36b00 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
36b10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
36b20 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
36b30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
36b40 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
36b50 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
36b60 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
36b70 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
36b80 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
36b90 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
36ba0 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
36bb0 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
36bc0 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
36bd0 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
36be0 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
36bf0 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
36c00 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
36c10 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
36c20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
36c30 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
36c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
36c50 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
36c60 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
36c70 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
36c80 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
36c90 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
36ca0 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
36cb0 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
36cc0 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
36cd0 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
36ce0 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
36cf0 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
36d00 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
36d10 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
36d20 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
36d30 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
36d40 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
36d50 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
36d60 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
36d70 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
36d80 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
36d90 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
36da0 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
36db0 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
36dc0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
36dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36df0 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
36e00 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
36e10 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
36e20 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
36e30 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
36e40 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
36e50 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
36e60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
36e70 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
36e80 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
36e90 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
36ea0 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
36eb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
36ec0 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
36ed0 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
36ee0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
36ef0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
36f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
36f10 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
36f20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
36f30 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
36f40 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
36f50 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
36f60 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
36f70 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
36f80 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
36f90 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
36fa0 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
36fc0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
36fd0 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
36fe0 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
36ff0 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
37000 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
37010 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
37020 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
37030 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
37040 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
37050 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
37060 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
37070 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
37080 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
37090 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
370a0 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
370b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
370c0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
370d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
370e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
370f0 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
37100 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
37110 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
37120 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
37130 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
37140 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
37150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
37160 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
37170 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
37180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
37190 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
371a0 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
371b0 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
371c0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
371d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
371e0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
371f0 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
37200 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
37210 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
37220 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
37230 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
37240 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
37250 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
37260 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
37270 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
37280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
37290 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
372a0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
372b0 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
372c0 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
372d0 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
372e0 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
372f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
37300 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37310 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
37320 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
37330 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
37340 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
37350 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
37360 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
37370 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
37380 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
37390 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
373a0 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
373b0 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
373c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
373d0 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
373e0 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
373f0 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
37400 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
37410 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
37420 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
37430 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
37440 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
37450 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
37460 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
37470 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37480 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
37490 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
374a0 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
374b0 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
374c0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
374d0 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
374e0 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
374f0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
37500 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
37510 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
37520 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
37530 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
37540 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
37550 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
37560 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
37570 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
37580 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
37590 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
375a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
375b0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
375c0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
375d0 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
375e0 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
375f0 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
37600 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
37610 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37620 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
37630 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37640 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
37650 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37660 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
37670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37690 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
376a0 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
376b0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
376c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
376d0 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
376e0 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
376f0 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
37700 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
37710 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
37720 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
37730 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
37740 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
37750 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
37760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
37770 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
37780 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
37790 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
377a0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
377b0 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
377c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
377d0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
377e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
377f0 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
37800 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
37810 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
37820 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
37830 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
37840 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
37850 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
37860 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
37870 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
37880 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
37890 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66          robust_f
378a0 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
378b0 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
378c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
378d0 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
378e0 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
378f0 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
37900 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
37910 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
37920 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
37930 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
37940 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
37950 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
37960 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
37970 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
37980 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
37990 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
379a0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
379b0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
379c0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
379d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
379e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
379f0 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
37a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
37a10 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
37a20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
37a30 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
37a40 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
37a50 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
37a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
37a70 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
37a80 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
37a90 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
37aa0 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ad0 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
37ae0 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
37af0 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
37b00 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
37b10 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
37b20 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
37b30 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
37b40 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
37b50 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
37b60 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
37b70 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23  le->h, cmode);.#
37b80 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
37b90 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
37ba0 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64     rc = osFchmod
37bb0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
37bc0 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
37bd0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
37be0 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
37bf0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
37c00 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
37c20 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
37c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
37c40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
37c50 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
37c60 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
37c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c80 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
37c90 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
37ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
37cb0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
37cc0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
37cd0 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
37ce0 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
37cf0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
37d00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
37d10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
37d20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
37d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
37d40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
37d50 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
37d60 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
37d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d80 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
37d90 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
37da0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
37db0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37dc0 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
37dd0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
37de0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
37df0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37e00 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
37e10 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
37e20 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
37e30 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
37e40 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
37e50 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
37e60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37e70 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
37e80 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
37e90 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20       int fd;.   
37ea0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
37eb0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
37ec0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37ed0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
37ee0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
37ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
37f00 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
37f10 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
37f20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
37f30 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
37f40 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
37f50 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
37f60 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
37f70 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20  n", fd));.      
37f80 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
37f90 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
37fa0 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20  h = fd;.        
37fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
37fc0 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
37fd0 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c  PEN_BKPT; /* SQL
37fe0 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54  ITE_BUSY? proxyT
37ff0 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a  akeConch called.
38000 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e             durin
38010 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  g locking */.   
38020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
38040 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d  ITE_OK && !pCtx-
38050 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20  >lockProxy ){.  
38060 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
38070 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   = tempLockPath 
38080 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a  ? tempLockPath :
38090 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
380a0 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63  Path;.        rc
380b0 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
380c0 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43  ixFile(path, &pC
380d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31  tx->lockProxy, 1
380e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
380f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
38100 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
38110 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61   && tryOldLockPa
38120 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
38130 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63  /* we couldn't c
38140 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20  reate the proxy 
38150 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74  lock file with t
38160 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65  he old lock file
38170 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
38180 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e   ** so try again
38190 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67   via auto-naming
381a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a   .           */.
381b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e            forceN
381c0 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ewLockPath = 1;.
381d0 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
381e0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
381f0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
38200 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20  ; /* go back to 
38210 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20  the do {} while 
38220 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79  start point, try
38230 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
38240 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
38270 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  * Need to make a
38280 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66   copy of path if
38290 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68   we extracted th
382a0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
382b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e   ** from the con
382c0 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  ch file or the p
382d0 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  ath was allocate
382e0 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20  d on the stack. 
382f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
38300 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50     if( tempLockP
38310 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
38320 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38330 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
38340 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f  StrDup(0, tempLo
38350 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  ckPath);.       
38360 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
38370 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
38380 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
38390 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
383a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
383b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
383c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
383d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
383e0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
383f0 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
38400 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
38410 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
38420 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
38430 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ds ){.          
38440 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
38450 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20  t *afpCtx;.     
38460 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61       afpCtx = (a
38470 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
38480 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   *)pCtx->lockPro
38490 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  xy->lockingConte
384a0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  xt;.          af
384b0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70  pCtx->dbPath = p
384c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
384d0 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  th;.        }.  
384e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
384f0 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e       conchFile->
38500 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
38510 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
38520 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
38530 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
38540 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
38550 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
38560 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
38570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
38580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
38590 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ":"f