/ Hex Artifact Content
Login

Artifact 42684a59b06b912b3ab80a8ad9f4295c0572a1f4:


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 5f 42 53 44 5f 53 4f 55 52 43  #elif _BSD_SOURC
25310 45 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  E.  return getpa
25320 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
25330 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
25340 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
25350 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ZE);.#endif.}../
25360 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
25370 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
25380 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
25390 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ng maintained by
253a0 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
253b0 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77  ptor pFd to nNew
253c0 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73   bytes. Any exis
253d0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
253e0 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a  discarded..**.**
253f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
25400 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
25410 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
25420 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
25430 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
25440 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20  .pMapRegion.**  
25450 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
25460 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  apSize.**       
25470 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 4f 72 69  unixFile.mmapOri
25480 67 73 69 7a 65 0a 2a 2a 0a 2a 2a 20 49 66 20 75  gsize.**.** If u
25490 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20  nsuccessful, an 
254a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
254b0 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69   logged via sqli
254c0 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a  te3_log() and.**
254d0 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61   the three varia
254e0 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a  bles above are z
254f0 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63  eroed. In this c
25500 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c  ase SQLite shoul
25510 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63  d.** continue ac
25520 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
25530 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78  base using the x
25540 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74  Read() and xWrit
25550 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a  e().** methods..
25560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
25570 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20  nixRemapfile(.  
25580 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20  unixFile *pFd,  
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
255b0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
255c0 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20  64 nNew         
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
255e0 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69  * Required mappi
255f0 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  ng size */.){.  
25600 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
25610 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74   = "mmap";.  int
25620 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20   h = pFd->h;    
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
25650 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20  ptor open on db 
25660 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f  file */.  u8 *pO
25670 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d  rig = (u8 *)pFd-
25680 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f  >pMapRegion;   /
25690 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
256a0 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e  rent file mappin
256b0 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67  g */.  i64 nOrig
256c0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 4f 72 69 67   = pFd->mmapOrig
256d0 73 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  size;       /* S
256e0 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67  ize of pOrig reg
256f0 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ion in bytes */.
25700 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20    u8 *pNew = 0; 
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
25730 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e  on of new mappin
25740 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  g */.  int flags
25750 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20   = PROT_READ;   
25760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25770 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
25780 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73  mmap() */..  ass
25790 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
257a0 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Out==0 );.  asse
257b0 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d  rt( nNew>pFd->mm
257c0 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
257d0 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d  rt( nNew<=pFd->m
257e0 6d 61 70 4c 69 6d 69 74 20 29 3b 0a 20 20 61 73  mapLimit );.  as
257f0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
25800 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d    assert( pFd->m
25810 6d 61 70 4f 72 69 67 73 69 7a 65 3e 3d 70 46 64  mapOrigsize>=pFd
25820 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
25830 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
25840 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
25850 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
25860 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
25870 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
25880 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
25890 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 20 20 20  if( pOrig ){.   
258a0 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73   const int szSys
258b0 70 61 67 65 20 3d 20 75 6e 69 78 47 65 74 50 61  page = unixGetPa
258c0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
258d0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
258e0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
258f0 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 20 20 20  Syspage-1));.   
25900 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
25910 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
25920 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
25930 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
25940 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
25950 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
25960 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
25970 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
25980 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
25990 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
259a0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
259b0 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
259c0 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
259d0 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
259e0 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
259f0 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
25a00 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
25a10 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
25a20 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
25a30 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
25a40 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
25a50 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
25a60 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
25a70 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
25a80 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
25a90 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
25aa0 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
25ab0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
25ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25ad0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
25ae0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
25af0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
25b00 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
25b10 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
25b20 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
25b30 64 2e 20 46 72 65 65 20 74 68 65 20 65 78 69 73  d. Free the exis
25b40 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ting.    ** mapp
25b50 69 6e 67 20 61 6e 64 20 73 65 74 20 70 4e 65 77  ing and set pNew
25b60 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 61 74   to NULL so that
25b70 20 74 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   the code below 
25b80 77 69 6c 6c 20 63 72 65 61 74 65 20 61 0a 20 20  will create a.  
25b90 20 20 2a 2a 20 6e 65 77 20 6d 61 70 70 69 6e 67    ** new mapping
25ba0 20 66 72 6f 6d 20 73 63 72 61 74 63 68 2e 20 20   from scratch.  
25bb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  */.    if( pNew=
25bc0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
25bd0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f       osMunmap(pO
25be0 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  rig, nReuse);.  
25bf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
25c00 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e   pNew is still N
25c10 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61  ULL, try to crea
25c20 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e  te an entirely n
25c30 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  ew mapping. */. 
25c40 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
25c50 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
25c60 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73  p(0, nNew, flags
25c70 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
25c80 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
25c90 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
25ca0 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30   ){.    pNew = 0
25cb0 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a  ;.    nNew = 0;.
25cc0 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
25cd0 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72  (SQLITE_OK, zErr
25ce0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a  , pFd->zPath);..
25cf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d      /* If the mm
25d00 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65  ap() above faile
25d10 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  d, assume that a
25d20 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d  ll subsequent mm
25d30 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  ap() calls.    *
25d40 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  * will probably 
25d50 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62  fail too. Fall b
25d60 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65  ack to using xRe
25d70 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73  ad/xWrite exclus
25d80 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20  ively.    ** in 
25d90 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
25da0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69     pFd->mmapLimi
25db0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  t = 0;.  }.  pFd
25dc0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
25dd0 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
25de0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
25df0 46 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  Fd->mmapOrigsize
25e00 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
25e10 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
25e20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
25e30 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
25e40 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
25e50 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
25e60 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
25e70 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
25e80 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
25e90 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
25ea0 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
25eb0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
25ec0 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
25ed0 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
25ee0 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
25ef0 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
25f00 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
25f10 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
25f20 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25f30 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
25f40 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
25f50 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
25f60 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
25f70 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
25f80 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
25f90 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
25fa0 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
25fb0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
25fc0 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
25fd0 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
25fe0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25ff0 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
26000 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
26010 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
26020 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
26030 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
26040 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
26050 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
26060 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
26070 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
26080 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
26090 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
260a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
260b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
260c0 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
260d0 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
260e0 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
260f0 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
26100 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
26110 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
26120 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
26130 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
26140 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
26150 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
26160 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36  i64 nByte){.  i6
26170 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
26180 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
26190 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
261a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
261b0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
261c0 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
261d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
261e0 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
261f0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
26200 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
26210 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
26220 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
26230 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   */.    rc = osF
26240 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
26250 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
26260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26280 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
26290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
262a0 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
262b0 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
262c0 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69  ap>pFd->mmapLimi
262d0 74 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  t ){.    nMap = 
262e0 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3b 0a  pFd->mmapLimit;.
262f0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21    }..  if( nMap!
26300 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
26310 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e 30  {.    if( nMap>0
26320 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52 65   ){.      unixRe
26330 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
26340 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
26350 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
26360 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20  le(pFd);.    }. 
26370 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
26380 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26390 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
263a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
263b0 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
263c0 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
263d0 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
263e0 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
263f0 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
26400 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
26410 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
26420 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
26430 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
26440 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
26450 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26460 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
26470 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
26480 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
26490 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
264a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
264b0 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
264c0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
264d0 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
264e0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
264f0 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
26500 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
26510 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
26520 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
26530 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
26540 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
26550 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
26560 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
26570 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
26580 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
26590 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
265a0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
265b0 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c  nt unixFetch(sql
265c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
265d0 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
265e0 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 20  t, void **pp){. 
265f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
26600 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
26610 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
26620 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
26630 6c 65 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 30 3b  le */.  *pp = 0;
26640 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  ..  if( pFd->mma
26650 70 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  pLimit>0 ){.    
26660 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
26670 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
26680 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70  int rc = unixMap
26690 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
266a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
266b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
266c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
266d0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
266e0 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
266f0 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
26700 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
26710 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
26720 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
26730 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
26740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
26760 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
26770 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
26780 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26790 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
267a0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
267b0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
267c0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
267d0 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
267e0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
267f0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
26800 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
26810 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
26820 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
26830 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
26840 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
26850 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
26860 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
26870 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
26880 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
26890 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
268a0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
268b0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
268c0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
268d0 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
268e0 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
268f0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
26900 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
26910 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
26920 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
26930 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
26940 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
26950 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
26960 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75  f, void *p){.  u
26970 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
26980 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
26990 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
269a0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
269b0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
269c0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
269d0 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
269e0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
269f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
26a00 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
26a10 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
26a20 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
26a30 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
26a40 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
26a50 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
26a60 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
26a70 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
26a80 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
26a90 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
26aa0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
26ab0 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
26ac0 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
26ad0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
26ae0 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
26af0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
26b00 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
26b10 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
26b20 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
26b30 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
26b40 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
26b50 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
26b60 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
26b70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26b80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26b90 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
26ba0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
26bb0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
26bc0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
26bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26be0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
26bf0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
26c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
26c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
26c70 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
26c80 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
26c90 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
26ca0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26cb0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
26cc0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
26cd0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
26ce0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
26cf0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
26d00 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
26d10 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
26d20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
26d30 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
26d40 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
26d50 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
26d60 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
26d70 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
26d80 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
26d90 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
26da0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
26db0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
26dc0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
26dd0 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
26de0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
26df0 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
26e00 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
26e10 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
26e20 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
26e30 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
26e40 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
26e50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26e60 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
26e70 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
26e80 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
26e90 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
26ea0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
26eb0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
26ec0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
26ed0 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
26ee0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
26ef0 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
26f00 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
26f10 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
26f20 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
26f30 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
26f40 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
26f50 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
26f60 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
26f70 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
26f80 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
26f90 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
26fa0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
26fb0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
26fc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26fd0 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
26fe0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
26ff0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
27000 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
27010 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
27020 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
27030 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
27040 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
27050 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
27060 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
27070 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
27080 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
27090 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
270a0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
270b0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
270c0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
270d0 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
270e0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
270f0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
27100 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27110 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
27120 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
27130 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
27140 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
27150 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
27160 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
27170 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
27180 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
27190 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
271a0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
271b0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
271c0 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
271d0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
271e0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
271f0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
27200 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
27210 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
27220 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
27230 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
27240 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
27250 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
27260 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
27290 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
272a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
272b0 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
272e0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
272f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
27300 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
27330 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
27340 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
27350 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
27380 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
27390 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
273a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
273d0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
273e0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
273f0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
27420 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27430 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
27470 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
27480 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
27490 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
27580 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
275a0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
275b0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
275c0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
275d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
275f0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
27600 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
27610 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27640 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
27650 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
27660 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
27670 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
27680 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27690 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20   unixShmMap,    
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
276b0 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
276e0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
276f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27700 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
27730 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
27740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
27750 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
27780 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
27790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
277a0 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
277d0 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
277e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
277f0 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27810 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
27820 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
27830 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
27840 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278b0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
278c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
278d0 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
278e0 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
278f0 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
27900 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
27910 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
27920 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
27930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
27960 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
27a00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27a10 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
27a20 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
27a30 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
27a40 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
27a50 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
27a60 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
27a70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27a80 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
27a90 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
27aa0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
27ab0 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
27ac0 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
27ad0 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
27ae0 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
27af0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
27b00 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
27b10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
27b20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
27b30 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
27b40 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
27b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
27b60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
27b70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
27b80 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
27b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
27ba0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
27bb0 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
27bc0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
27bf0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c10 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
27c20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27c40 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
27c50 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
27c60 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
27c70 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
27c80 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
27c90 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
27ca0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
27cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
27cc0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
27cd0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
27ce0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
27cf0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
27d00 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
27d10 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
27d40 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
27d50 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d70 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
27d80 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27da0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
27db0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27dd0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
27de0 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
27df0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
27e00 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
27e10 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
27e20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
27e30 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
27e40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
27e50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
27e60 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
27e70 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
27e80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27e90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
27ea0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ec0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
27ed0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
27ee0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
27ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
27f00 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
27f10 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
27f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
27f30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
27f40 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
27f50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
27f60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
27f70 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
27f80 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
27f90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
27fa0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
27fb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
27fc0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
27fd0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
27fe0 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
27ff0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
28000 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28010 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28020 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
28030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
28040 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28050 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28060 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28080 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28090 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
280a0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
280b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
280c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
280d0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
280e0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
280f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
28100 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
28110 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
28120 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
28130 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
28140 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
28150 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28160 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
28170 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
28180 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
28190 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
281a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
281b0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
281c0 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
281d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
281e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
281f0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
28200 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28220 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28230 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
28240 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
28250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28260 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
28270 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
28280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28290 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
282a0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
282b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
282c0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
282d0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
282e0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
282f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28300 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
28310 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
28320 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
28330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28340 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
28350 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
28360 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
28370 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28380 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
28390 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
283a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
283b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
283c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
283d0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
283e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
283f0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
28400 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
28410 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
28420 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28430 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
28440 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28450 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28460 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
28470 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
28480 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28490 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
284a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
284b0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
284c0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
284d0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
284e0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
284f0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
28500 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
28510 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
28520 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
28530 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
28540 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
28550 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
28560 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
28570 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
28580 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
28590 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
285a0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
285b0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
285c0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
285d0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
285e0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
285f0 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
28600 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
28610 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
28620 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
28630 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
28640 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
28650 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
28660 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
28670 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
28680 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
28690 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
286a0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
286b0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
286c0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
286d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
286e0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
286f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
28700 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
28710 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
28720 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
28730 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
28740 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
28750 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
28760 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
28770 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
28780 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
28790 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
287a0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
287b0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
287c0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
287d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
287e0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
287f0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
28800 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
28810 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
28820 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
28830 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
28860 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
28870 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28890 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
288a0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288c0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
288d0 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
288f0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28900 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
28910 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
28920 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
28930 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
28940 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
28950 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
28960 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
28970 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
28980 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
28990 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
289a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
289b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
289c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
289d0 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
289e0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
289f0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
28a00 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
28a10 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28a40 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
28a50 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a70 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28a80 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
28a90 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28ab0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28ac0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ae0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
28af0 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b10 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28b20 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
28b30 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
28b40 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28b50 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28b60 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
28b70 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
28b80 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28b90 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
28ba0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
28bb0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
28bc0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
28bd0 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
28be0 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
28bf0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
28c00 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
28c10 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
28c20 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
28c30 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
28c40 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
28c50 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
28c60 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
28c70 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
28c80 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
28c90 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28ca0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
28cb0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
28cc0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
28cd0 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
28ce0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28cf0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
28d00 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
28d10 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
28d20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
28d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28d40 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
28d50 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
28d60 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
28d70 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d90 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
28da0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
28db0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28dc0 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
28dd0 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
28de0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
28df0 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
28e00 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
28e10 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
28e20 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
28e30 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
28e40 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
28e50 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
28e60 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
28e70 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
28e80 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
28e90 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
28ea0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
28eb0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
28ec0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
28ed0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
28ee0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
28ef0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
28f00 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
28f10 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
28f20 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
28f30 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
28f40 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
28f50 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
28f60 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
28f70 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
28f80 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
28f90 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
28fa0 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
28fb0 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
28fc0 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
28fd0 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
28fe0 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
28ff0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29000 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
29010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
29020 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
29030 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
29040 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
29050 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
29060 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
29070 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
29080 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29090 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
290a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
290b0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
290c0 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
290d0 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
290e0 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
290f0 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
29100 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
29110 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
29120 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
29130 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
29140 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
29150 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
29160 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
29170 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
29180 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
29190 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
291a0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
291b0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
291c0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
291d0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
291e0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
291f0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
29200 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
29210 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
29220 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
29230 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
29240 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
29250 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
29260 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
29270 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
29280 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29290 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
292a0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
292b0 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
292c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
292d0 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
292e0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
292f0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
29300 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
29310 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
29320 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
29330 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29340 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29350 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
29360 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
29370 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29380 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29390 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
293a0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
293b0 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
293c0 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
293d0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
293e0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
293f0 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
29400 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
29410 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
29420 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
29430 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
29440 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
29450 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
29460 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
29470 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
29480 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29490 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
294a0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
294b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
294c0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
294d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
294e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
294f0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
29500 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
29510 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
29520 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
29530 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
29540 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
29550 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
29560 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
29570 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
29580 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
29590 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
295a0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
295b0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
295c0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
295d0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
295e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
295f0 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
29600 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
29610 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
29620 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
29630 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
29640 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
29650 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
29660 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
29670 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
29680 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
29690 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
296a0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
296b0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
296c0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
296d0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
296e0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
296f0 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
29700 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
29710 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
29720 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
29730 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
29740 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
29750 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29760 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
29770 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
29780 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
29790 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
297a0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
297b0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
297c0 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
297d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
297e0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
297f0 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
29800 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
29810 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
29820 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
29830 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
29840 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29850 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
29860 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
29870 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
29880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
298d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298e0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
298f0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
29900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29910 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
29920 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
29930 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
29940 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
29950 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
29960 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
29970 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
29980 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
29990 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
299a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
299b0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
299c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
299d0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
299e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
299f0 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
29a00 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
29a10 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a30 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
29a40 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
29a50 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
29a60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
29a70 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
29a80 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
29a90 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
29aa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29ab0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
29ac0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
29ad0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
29ae0 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
29af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
29b00 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
29b10 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
29b20 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
29b30 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
29b40 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
29b50 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
29b60 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
29b70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29b80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29b90 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
29ba0 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55  =NULL );..  /* U
29bb0 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
29bc0 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
29bd0 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
29be0 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
29bf0 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
29c00 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
29c10 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
29c20 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
29c30 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
29c40 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
29c50 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
29c60 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
29c70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29c80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29c90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29ca0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
29cb0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
29cc0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
29cd0 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
29ce0 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
29cf0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
29d00 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
29d10 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
29d20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
29d30 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
29d40 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
29d50 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
29d60 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
29d70 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
29d80 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26   || (ctrlFlags &
29d90 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
29da0 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  )!=0 );..  OSTRA
29db0 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
29dc0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
29dd0 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
29de0 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
29df0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
29e00 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
29e10 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e  lename;.  pNew->
29e20 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29  ctrlFlags = (u8)
29e30 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65  ctrlFlags;.  pNe
29e40 77 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 53  w->mmapLimit = S
29e50 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
29e60 41 50 5f 4c 49 4d 49 54 3b 0a 20 20 69 66 28 20  AP_LIMIT;.  if( 
29e70 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
29e80 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
29e90 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
29ea0 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
29eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
29ed0 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
29ee0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
29ef0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
29f00 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
29f10 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
29f20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
29f30 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
29f40 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
29f50 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
29f60 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
29f70 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
29f80 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
29f90 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
29fa0 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
29fb0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
29fc0 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
29fd0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
29fe0 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
29ff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a000 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a010 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2a020 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2a030 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2a040 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2a050 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2a060 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2a070 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2a080 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2a090 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2a0a0 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2a0b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a0c0 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2a0d0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2a0e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2a0f0 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2a100 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2a110 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2a120 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2a130 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2a140 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2a150 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2a160 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2a170 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2a180 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2a190 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2a1a0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2a1b0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2a1c0 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2a1d0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2a1e0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2a1f0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a200 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a210 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a220 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a230 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2a240 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2a250 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2a260 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2a270 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2a280 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2a290 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2a2a0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2a2b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a2c0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2a2d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2a2e0 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2a2f0 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2a300 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a310 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2a320 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2a330 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2a340 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2a350 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2a360 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2a370 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2a380 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2a390 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2a3a0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2a3b0 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2a3c0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2a3d0 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2a3e0 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2a3f0 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2a400 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2a410 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2a420 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2a430 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2a440 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2a450 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2a460 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2a470 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2a480 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2a490 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2a4a0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2a4b0 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2a4c0 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2a4d0 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2a4e0 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2a4f0 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2a500 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2a510 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2a520 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2a530 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2a540 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2a550 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2a560 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2a570 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2a580 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2a590 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2a5a0 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2a5b0 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2a5c0 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2a5d0 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2a5e0 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2a5f0 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2a600 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2a610 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2a620 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2a630 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2a640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2a650 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2a660 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2a670 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2a680 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2a690 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2a6a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2a6b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2a6c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a6d0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2a6e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2a6f0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2a700 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2a710 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2a720 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2a730 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2a740 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2a750 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2a760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2a770 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2a780 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2a790 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2a7a0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2a7b0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
2a7c0 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
2a7d0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
2a7e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2a7f0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2a800 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2a810 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2a820 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2a830 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2a840 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2a850 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2a860 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2a870 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2a880 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2a890 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2a8a0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2a8b0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2a8c0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2a8d0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2a8e0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2a8f0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2a900 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2a910 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2a920 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2a930 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2a940 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2a950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a970 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2a980 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2a990 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2a9a0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2a9b0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2a9c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2a9d0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2a9e0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2a9f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2aa00 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2aa10 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2aa20 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2aa30 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2aa40 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2aa50 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2aa60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2aa70 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2aa80 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2aa90 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2aaa0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2aab0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2aac0 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2aad0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2aae0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2aaf0 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2ab00 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2ab10 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2ab20 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2ab30 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e  e3_malloc(nFilen
2ab40 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2ab50 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2ab60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ab70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2ab80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ab90 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2aba0 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2abb0 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2abc0 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2abd0 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2abe0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2abf0 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2ac00 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2ac10 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2ac20 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2ac30 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2ac40 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2ac50 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2ac60 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2ac70 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2ac80 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2ac90 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2aca0 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2acb0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2acc0 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2acd0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2ace0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2acf0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2ad00 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2ad10 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2ad20 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2ad30 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2ad40 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2ad50 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2ad60 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2ad70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2ad80 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2ad90 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2ada0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2adb0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2adc0 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2add0 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2ade0 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2adf0 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2ae00 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2ae10 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2ae20 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2ae30 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2ae40 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2ae50 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2ae60 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2ae70 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2ae80 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2ae90 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2aea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2aeb0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2aec0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2aed0 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2aee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2aef0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2af00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2af10 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72  .  pNew->lastErr
2af20 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56  no = 0;.#if OS_V
2af30 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2af40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2af50 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2af60 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2af70 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2af80 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2af90 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2afa0 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
2afb0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
2afc0 73 44 65 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e  sDelete ) pNew->
2afd0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2afe0 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65  XFILE_DELETE;.#e
2aff0 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
2b000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b010 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2b020 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2b030 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
2b040 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
2b050 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
2b060 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
2b070 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d  Counter(+1);.  }
2b080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b090 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2b0a0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2b0b0 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2b0c0 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2b0d0 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2b0e0 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2b0f0 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2b100 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2b110 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2b120 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2b130 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2b140 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2b150 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2b160 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2b170 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2b180 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2b190 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2b1a0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2b1b0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
2b1c0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
2b1d0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2b1e0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
2b1f0 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
2b200 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2b210 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
2b220 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2b230 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
2b240 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2b250 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2b260 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
2b270 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
2b280 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2b290 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
2b2a0 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
2b2b0 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
2b2c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2b2d0 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2b2e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2b2f0 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
2b300 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
2b310 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2b320 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
2b330 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
2b340 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
2b350 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a  return zDir;.}..
2b360 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2b370 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2b380 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2b390 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2b3a0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2b3b0 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2b3c0 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2b3d0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2b3e0 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2b3f0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2b400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b410 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2b420 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2b430 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2b440 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2b450 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
2b460 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
2b470 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
2b480 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2b490 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
2b4a0 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
2b4b0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2b4c0 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63   i, j;.  const c
2b4d0 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a  har *zDir;..  /*
2b4e0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2b4f0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2b500 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2b510 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2b520 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2b530 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2b540 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2b550 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2b560 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2b570 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
2b580 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b590 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b5a0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
2b5b0 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d    zDir = unixTem
2b5c0 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66  pFileDir();.  if
2b5d0 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72  ( zDir==0 ) zDir
2b5e0 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68   = ".";..  /* Ch
2b5f0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
2b600 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
2b610 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
2b620 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
2b630 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
2b640 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
2b650 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
2b660 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
2b670 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
2b680 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
2b690 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38  ILE_PREFIX) + 18
2b6a0 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
2b6b0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2b6c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b6d0 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
2b6e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2b6f0 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73  uf-18, zBuf, "%s
2b700 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2b710 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
2b720 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
2b730 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
2b740 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2b750 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
2b760 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2b770 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
2b780 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
2b790 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
2b7a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
2b7b0 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
2b7c0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
2b7d0 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
2b7e0 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  = 0;.    zBuf[j+
2b7f0 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  1] = 0;.  }while
2b800 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2b810 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2b820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b830 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2b840 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2b850 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b860 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2b870 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2b880 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2b890 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2b8a0 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2b8b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2b8c0 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2b8d0 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2b8e0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2b8f0 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2b900 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2b910 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2b920 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b930 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2b940 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2b950 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2b960 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2b970 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2b980 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2b990 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2b9a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2b9b0 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2b9c0 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2b9d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2b9e0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2b9f0 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2ba00 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2ba10 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2ba20 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2ba30 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2ba40 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2ba50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2ba60 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2ba70 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2ba80 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2ba90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2baa0 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2bab0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2bac0 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2bad0 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2bae0 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2baf0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2bb00 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2bb10 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2bb20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2bb30 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2bb40 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2bb50 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2bb60 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2bb70 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2bb80 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2bb90 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2bba0 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2bbb0 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2bbc0 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2bbd0 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2bbe0 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2bbf0 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2bc00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2bc10 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2bc20 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2bc30 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2bc40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2bc50 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2bc60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2bc70 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2bc80 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2bc90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2bca0 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2bcb0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2bcc0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2bcd0 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2bce0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2bcf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2bd00 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2bd10 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2bd20 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2bd30 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2bd40 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2bd50 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2bd60 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2bd70 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2bd80 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2bd90 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2bda0 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2bdb0 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2bdc0 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2bdd0 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2bde0 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2bdf0 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2be00 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2be10 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2be20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2be40 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2be50 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2be60 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2be70 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2be80 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2be90 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2bea0 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2beb0 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2bec0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2bed0 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2bee0 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2bef0 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2bf00 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2bf10 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2bf20 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2bf30 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2bf40 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2bf50 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2bf60 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2bf70 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2bf80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2bf90 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2bfa0 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2bfb0 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2bfc0 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2bfd0 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2bfe0 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2bff0 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2c000 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2c010 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2c020 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61  ing for a resusa
2c030 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2c040 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65  tor are not dire
2c050 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f  .  */.  if( 0==o
2c060 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53  sStat(zPath, &sS
2c070 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  tat) ){.    unix
2c080 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
2c090 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  e;..    unixEnte
2c0a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49  rMutex();.    pI
2c0b0 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
2c0c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
2c0d0 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e  ode && (pInode->
2c0e0 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61  fileId.dev!=sSta
2c0f0 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20  t.st_dev.       
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2c110 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e   pInode->fileId.
2c120 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e  ino!=sStat.st_in
2c130 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e  o) ){.       pIn
2c140 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
2c150 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
2c160 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  f( pInode ){.   
2c170 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
2c180 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
2c190 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  pp=&pInode->pUnu
2c1a0 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70  sed; *pp && (*pp
2c1b0 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b  )->flags!=flags;
2c1c0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
2c1d0 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75  xt));.      pUnu
2c1e0 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20  sed = *pp;.     
2c1f0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2c200 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
2c210 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
2c220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c230 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20  ;.  }.#endif    
2c250 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
2c260 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
2c270 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
2c280 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2c290 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
2c2a0 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
2c2b0 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
2c2c0 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
2c2d0 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
2c2e0 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
2c2f0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2c300 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c310 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
2c320 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
2c330 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
2c340 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
2c350 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
2c360 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
2c370 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2c380 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2c390 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2c3a0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
2c3b0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2c3c0 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
2c3d0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
2c3e0 6d 6f 73 74 20 63 61 73 65 73 20 63 61 73 65 73  most cases cases
2c3f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
2c400 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c  ets *pMode to 0,
2c410 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f   which will beco
2c420 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74  me.** an indicat
2c430 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70  ion to robust_op
2c440 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74  en() to create t
2c450 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a  he file using.**
2c460 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2c470 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2c480 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65   adjusted by the
2c490 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69   umask..** But i
2c4a0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2c4b0 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
2c4c0 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
2c4d0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
2c4e0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2c4f0 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
2c500 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2c510 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
2c520 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
2c530 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
2c540 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
2c550 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
2c560 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
2c570 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
2c580 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2c590 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
2c5a0 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
2c5b0 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
2c5c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2c5d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2c5e0 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
2c5f0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2c600 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2c610 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
2c620 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
2c630 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
2c640 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
2c650 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
2c660 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
2c670 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
2c680 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
2c690 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
2c6a0 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
2c6b0 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
2c6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c6d0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2c6e0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2c6f0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2c700 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
2c710 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
2c720 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
2c730 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c750 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
2c760 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
2c770 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
2c780 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
2c790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c7a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
2c7b0 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
2c7c0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
2c7d0 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c7f0 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
2c800 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2c810 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
2c840 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2c850 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2c860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2c870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c880 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
2c890 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69  Mode = 0;.  *pUi
2c8a0 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d  d = 0;.  *pGid =
2c8b0 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20   0;.  if( flags 
2c8c0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2c8d0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2c8e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2c8f0 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
2c900 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
2c910 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2c920 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
2c930 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c950 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
2c960 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
2c970 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2c980 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2c990 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
2c9a0 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
2c9b0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
2c9c0 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
2c9d0 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
2c9e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2c9f0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2ca00 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
2ca10 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
2ca20 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2ca30 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
2ca40 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
2ca50 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
2ca60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
2ca70 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
2ca80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2ca90 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2caa0 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
2cab0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2cac0 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2cad0 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2cae0 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
2caf0 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
2cb00 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
2cb10 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
2cb20 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2cb30 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2cb40 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2cb50 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2cb60 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2cb70 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2cb80 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2cb90 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2cba0 31 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1; .#ifdef SQLIT
2cbb0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
2cbc0 45 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44  ES.    while( nD
2cbd0 62 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  b>0 && sqlite3Is
2cbe0 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d  alnum(zPath[nDb]
2cbf0 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69  ) ) nDb--;.    i
2cc00 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
2cc10 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72  th[nDb]!='-' ) r
2cc20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cc30 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
2cc40 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
2cc50 27 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ' ){.      asser
2cc60 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20  t( nDb>0 );.    
2cc70 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b    assert( zPath[
2cc80 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20  nDb]!='\n' );.  
2cc90 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
2cca0 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63  .#endif.    memc
2ccb0 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
2ccc0 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
2ccd0 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69  ] = '\0';..    i
2cce0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62  f( 0==osStat(zDb
2ccf0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2cd00 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
2cd10 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
2cd20 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20  ;.      *pUid = 
2cd30 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20  sStat.st_uid;.  
2cd40 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2cd50 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65  t.st_gid;.    }e
2cd60 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2cd70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2cd80 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
2cd90 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
2cda0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2cdb0 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
2cdc0 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
2cdd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cde0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2cdf0 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
2ce00 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
2ce10 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
2ce20 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
2ce30 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
2ce40 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
2ce50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
2ce60 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
2ce70 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
2ce80 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
2ce90 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
2cea0 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2ceb0 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
2cec0 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
2ced0 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
2cee0 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
2cef0 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
2cf00 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
2cf10 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
2cf20 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
2cf30 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
2cf40 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
2cf50 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
2cf60 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
2cf70 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2cf80 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
2cf90 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
2cfa0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
2cfb0 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
2cfc0 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
2cfd0 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
2cfe0 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
2cff0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
2d000 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2d010 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
2d020 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
2d030 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
2d040 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
2d050 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
2d060 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
2d070 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
2d080 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
2d090 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
2d0a0 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
2d0b0 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
2d0c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
2d0d0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2d0e0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2d0f0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
2d100 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
2d110 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
2d120 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d130 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2d140 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
2d150 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
2d160 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2d170 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2d180 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
2d190 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
2d1a0 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
2d1b0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d1d0 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
2d1e0 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
2d1f0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
2d200 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
2d210 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2d220 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2d230 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
2d240 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
2d250 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
2d260 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
2d270 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2d280 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2d290 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
2d2a0 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
2d2b0 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
2d2c0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2d2d0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
2d2e0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
2d2f0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2d300 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
2d310 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2d320 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2d330 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
2d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d350 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
2d360 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
2d370 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d380 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d390 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2d3a0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2d3b0 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2d3c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d3d0 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66   /* UNIXFILE_* f
2d3e0 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  lags */..  int i
2d3f0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
2d400 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d410 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
2d420 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
2d430 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2d440 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2d450 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
2d460 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
2d470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d480 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
2d490 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
2d4a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2d4b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2d4c0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
2d4d0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
2d4e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2d4f0 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
2d500 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d510 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
2d520 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
2d530 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2d540 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
2d550 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
2d560 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2d570 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2d580 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75  ING_STYLE.  stru
2d590 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2d5a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
2d5b0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
2d5c0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
2d5d0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
2d5e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
2d5f0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
2d600 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2d610 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
2d620 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
2d630 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
2d640 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
2d650 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
2d660 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
2d670 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
2d680 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
2d690 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72   syncDir = (isCr
2d6a0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
2d6b0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
2d6c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2d6d0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
2d6e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2d6f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
2d700 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2d710 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
2d720 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
2d730 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
2d740 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
2d750 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
2d760 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
2d770 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
2d780 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
2d790 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
2d7a0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
2d7b0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
2d7c0 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
2d7d0 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+2];.  const 
2d7e0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
2d7f0 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
2d800 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2d810 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
2d820 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
2d830 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
2d840 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
2d850 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
2d860 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
2d870 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
2d880 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
2d890 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
2d8a0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2d8b0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
2d8c0 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
2d8d0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2d8e0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2d8f0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
2d900 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
2d910 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
2d920 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
2d930 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
2d940 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
2d950 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
2d960 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
2d970 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
2d980 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
2d990 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
2d9a0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
2d9b0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
2d9c0 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
2d9d0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
2d9e0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
2d9f0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
2da00 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
2da10 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
2da20 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
2da30 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
2da40 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2da50 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
2da60 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
2da70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
2da80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
2da90 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2daa0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2dab0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2dac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2dad0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2dae0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2daf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2db00 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2db10 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2db20 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2db30 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2db40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
2db50 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2db60 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2db70 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2db80 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
2db90 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
2dba0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
2dbb0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
2dbc0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
2dbd0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
2dbe0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2dbf0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
2dc00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2dc10 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
2dc20 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
2dc30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2dc40 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
2dc50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2dc60 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
2dc70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2dc80 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
2dc90 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
2dca0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2dcb0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2dcc0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2dcd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
2dce0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
2dcf0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2dd00 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  L.  );..  memset
2dd10 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
2dd20 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
2dd30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2dd40 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
2dd50 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
2dd60 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
2dd70 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
2dd80 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
2dd90 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
2dda0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
2ddb0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
2ddc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ddd0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
2dde0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2ddf0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
2de00 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
2de10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2de20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2de30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2de40 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
2de50 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a  pUnused;..    /*
2de60 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
2de70 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
2de80 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
2de90 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
2dea0 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20     ** URIs with 
2deb0 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
2dec0 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
2ded0 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
2dee0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
2def0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2df00 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2df10 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
2df20 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a  E_OPEN_URI) || z
2df30 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
2df40 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d  e)+1]==0 );..  }
2df50 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
2df60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
2df70 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
2df80 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
2df90 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
2dfa0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
2dfb0 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
2dfc0 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20   !syncDir);.    
2dfd0 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
2dfe0 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
2dff0 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+2, zTmpname);.
2e000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2e020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e030 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
2e040 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  name;..    /* Ge
2e050 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72  nerated temporar
2e060 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  y filenames are 
2e070 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65  always double-ze
2e080 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  ro terminated.  
2e090 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20    ** for use by 
2e0a0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
2e0b0 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20  meter(). */.    
2e0c0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74  assert( zName[st
2e0d0 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2e0e0 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  0 );.  }..  /* D
2e0f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
2e100 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
2e110 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
2e120 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
2e130 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
2e140 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
2e150 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
2e160 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
2e170 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
2e180 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
2e190 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2e1a0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
2e1b0 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
2e1c0 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
2e1d0 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
2e1e0 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
2e1f0 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
2e200 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
2e210 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
2e220 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
2e230 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2e240 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
2e250 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
2e260 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
2e270 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
2e280 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
2e290 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
2e2a0 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
2e2b0 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
2e2c0 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
2e2d0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
2e2e0 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20  de_t openMode;  
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e300 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72  ermissions to cr
2e310 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a  eate file with *
2e320 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b  /.    uid_t uid;
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e340 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f      /* Userid fo
2e350 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
2e360 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
2e390 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
2e3a0 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
2e3b0 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
2e3c0 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
2e3d0 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20  &uid, &gid);.   
2e3e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2e400 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
2e410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e420 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e430 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
2e440 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e450 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2e460 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e470 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
2e480 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2e490 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2e4a0 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
2e4b0 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
2e4c0 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
2e4d0 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
2e4e0 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
2e4f0 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
2e500 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
2e510 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
2e520 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
2e530 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
2e540 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
2e550 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
2e560 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
2e570 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
2e580 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e590 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2e5a0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
2e5b0 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
2e5c0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
2e5d0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
2e5e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e5f0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
2e600 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2e610 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
2e620 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
2e630 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2e640 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
2e650 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
2e660 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
2e670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2e680 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2e690 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2e6a0 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
2e6b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
2e6c0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
2e6d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2e6e0 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
2e6f0 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  ing as root and 
2e700 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  if creating a ne
2e710 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  w rollback.    *
2e720 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  * journal or WAL
2e730 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f   file, set the o
2e740 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
2e750 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74  journal or WAL t
2e760 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  o be.    ** the 
2e770 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67  same as the orig
2e780 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
2e790 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c     */.    if( fl
2e7a0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2e7b0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2e7c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2e7d0 20 29 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   ){.      osFcho
2e7e0 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29  wn(fd, uid, gid)
2e7f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
2e800 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
2e810 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
2e820 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
2e830 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2e840 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
2e850 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
2e860 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
2e870 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
2e880 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
2e890 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2e8a0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2e8b0 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
2e8c0 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73  me;.#else.    os
2e8d0 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
2e8e0 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
2e8f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e900 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
2e910 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
2e920 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2e930 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f    }.#endif..  no
2e940 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51  Lock = eType!=SQ
2e950 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2e960 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  B;..  .#if defin
2e970 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
2e980 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e990 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2e9a0 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
2e9b0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2e9c0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2e9d0 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
2e9e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2e9f0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2ea00 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2ea10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ea20 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2ea30 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
2ea40 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
2ea50 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2ea60 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
2ea70 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2ea80 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
2ea90 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
2eaa0 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
2eab0 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70  ..  /* Set up ap
2eac0 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c  propriate ctrlFl
2ead0 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ags */.  if( isD
2eae0 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20  elete )         
2eaf0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2eb00 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
2eb10 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61  ETE;.  if( isRea
2eb20 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20  donly )         
2eb30 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2eb40 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  = UNIXFILE_RDONL
2eb50 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  Y;.  if( noLock 
2eb60 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2eb70 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2eb80 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2eb90 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29  .  if( syncDir )
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebb0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2ebc0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
2ebd0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
2ebe0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20  LITE_OPEN_URI ) 
2ebf0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2ec00 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20  XFILE_URI;..#if 
2ec10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ec20 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
2ec30 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2ec40 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
2ec50 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
2ec60 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
2ec70 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
2ec80 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
2ec90 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
2eca0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
2ecb0 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
2ecc0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
2ecd0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2ece0 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2ecf0 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2ed00 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2ed10 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2ed20 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2ed30 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2ed40 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2ed50 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2ed60 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2ed70 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2ed80 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2ed90 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2eda0 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2edb0 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2edc0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2edd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2ede0 66 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c  f( statfs(zPath,
2edf0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2ee00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
2ee10 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f   theory, the clo
2ee20 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73  se(fd) call is s
2ee30 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74  ub-optimal. If t
2ee40 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20  he file opened. 
2ee50 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66         ** with f
2ee60 64 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  d is a database 
2ee70 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
2ee80 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  are other connec
2ee90 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20  tions open.     
2eea0 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69     ** on that fi
2eeb0 6c 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  le that are curr
2eec0 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64  ently holding ad
2eed0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20  visory locks on 
2eee0 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  it,.        ** t
2eef0 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hen the call to 
2ef00 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e  close() will can
2ef10 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  cel those locks.
2ef20 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20   In practice,.  
2ef30 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61        ** we're a
2ef40 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61  ssuming that sta
2ef50 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61  tfs() doesn't fa
2ef60 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41  il very often. A
2ef70 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
2ef80 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68  ** not while oth
2ef90 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2efa0 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ors opened by th
2efb0 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f  e same process o
2efc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2efd0 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77   same file are w
2efe0 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20  orking.  */.    
2eff0 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f      p->lastErrno
2f000 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
2f010 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2f020 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2f030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2f040 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2f050 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
2f060 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2f070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
2f080 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
2f090 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
2f0a0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
2f0b0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
2f0c0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
2f0d0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2f0e0 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
2f0f0 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20   ctrlFlags);.   
2f100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f120 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
2f130 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
2f140 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
2f150 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
2f160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f180 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
2f190 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
2f1a0 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
2f1b0 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
2f1c0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
2f1d0 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
2f1e0 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
2f1f0 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
2f200 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
2f210 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
2f220 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
2f230 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
2f240 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
2f250 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
2f260 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2f270 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
2f280 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f290 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2f2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
2f2b0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2f2c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2f2d0 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
2f2e0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
2f2f0 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
2f300 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
2f310 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
2f320 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f330 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2f340 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
2f350 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
2f360 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f370 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2f380 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2f390 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2f3a0 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
2f3b0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
2f3c0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
2f3d0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
2f3e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
2f3f0 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2f400 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2f410 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
2f420 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
2f430 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
2f440 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2f450 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
2f460 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2f470 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2f480 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
2f490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f4a0 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
2f4b0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2f4c0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
2f4d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2f4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
2f4f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2f500 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2f510 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2f520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2f530 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
2f540 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
2f550 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  ) ){.    if( err
2f560 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
2f570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f580 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
2f590 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
2f5a0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2f5b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2f5c0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
2f5d0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
2f5e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
2f5f0 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
2f600 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
2f610 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
2f620 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
2f630 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
2f640 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
2f650 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
2f660 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
2f680 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
2f690 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
2f6a0 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
2f6b0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
2f6c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
2f6d0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2f6e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2f6f0 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
2f700 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
2f710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f720 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2f730 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2f740 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2f750 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2f760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2f770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2f790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f7a0 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65   Test the existe
2f7b0 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
2f7c0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2f7d0 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
2f7e0 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
2f7f0 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
2f800 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
2f810 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
2f820 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
2f830 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2f840 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
2f850 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2f860 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
2f870 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2f880 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
2f890 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
2f8a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2f8b0 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
2f8c0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2f8d0 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
2f8e0 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2f8f0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
2f900 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
2f910 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2f920 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
2f930 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2f940 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
2f950 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2f960 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
2f970 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
2f980 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
2f990 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2f9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2f9b0 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
2f9c0 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
2f9d0 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2f9e0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2f9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2fa00 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2fa10 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2fa20 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2fa30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2fa40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2fa50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2fa60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2fa70 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2fa80 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2fa90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2faa0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2fab0 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2fac0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2fad0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2fae0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2faf0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2fb00 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2fb10 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2fb20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2fb30 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2fb40 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2fb50 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2fb60 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2fb70 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2fb80 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2fb90 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2fba0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2fbb0 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2fbc0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2fbd0 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2fbe0 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2fbf0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2fc00 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2fc10 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
2fc20 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
2fc30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
2fc40 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
2fc50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2fc60 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
2fc70 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
2fc80 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
2fc90 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
2fca0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
2fcb0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
2fcc0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2fcd0 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
2fce0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
2fcf0 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
2fd00 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
2fd10 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
2fd20 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
2fd30 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
2fd40 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
2fd50 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
2fd60 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
2fd70 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
2fd80 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
2fd90 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
2fda0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
2fdb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
2fdc0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2fdd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2fdf0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2fe00 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2fe10 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2fe20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2fe30 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2fe40 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2fe50 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
2fe60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2fe70 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2fe80 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2fe90 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2feb0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2fec0 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
2fed0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2fee0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2fef0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2ff00 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2ff10 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2ff20 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2ff30 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2ff40 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2ff50 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2ff60 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2ff70 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2ff80 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2ff90 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2ffa0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2ffb0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2ffc0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2ffd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2ffe0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2fff0 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
30000 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
30010 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
30020 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
30030 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
30040 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
30050 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
30060 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
30070 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30080 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
30090 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
300a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
300b0 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73  nCwd;.    if( os
300c0 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
300d0 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
300e0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
300f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
30100 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
30110 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
30120 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
30130 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
30140 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30150 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
30160 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
30170 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
30180 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30190 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
301a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
301b0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
301c0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
301d0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
301e0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
301f0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
30200 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
30210 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
30220 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
30230 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
30240 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
30250 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
30260 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
30270 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30280 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
30290 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
302a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
302b0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
302c0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
302d0 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
302e0 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
302f0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
30300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30310 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
30320 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
30330 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
30340 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
30350 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
30360 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
30370 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
30380 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
30390 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
303a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
303b0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
303c0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
303d0 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
303e0 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
303f0 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
30400 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
30410 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
30420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30430 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
30440 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
30450 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
30460 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
30470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
30480 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30490 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
304a0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
304b0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
304c0 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
304d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
304e0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
304f0 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
30500 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
30510 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
30520 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
30530 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
30540 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
30550 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
30560 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
30570 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
30580 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
30590 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
305a0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
305b0 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
305c0 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
305d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
305e0 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
305f0 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
30600 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
30610 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
30620 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
30630 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
30640 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
30650 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
30660 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
30670 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
30680 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
30690 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
306a0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
306b0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
306c0 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
306d0 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
306e0 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
306f0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
30700 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
30710 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
30720 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
30730 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
30740 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
30750 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
30760 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
30770 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
30780 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
30790 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
307a0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
307b0 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
307c0 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
307d0 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
307e0 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
307f0 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
30800 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
30810 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
30820 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
30830 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
30840 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
30850 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
30860 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
30870 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
30880 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
30890 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
308a0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
308b0 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
308c0 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
308d0 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
308e0 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
308f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30900 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
30910 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
30920 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
30930 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
30940 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
30950 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
30960 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
30970 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30980 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
30990 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
309a0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
309b0 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
309c0 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
309d0 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
309e0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
309f0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
30a00 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
30a10 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
30a20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
30a30 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
30a40 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
30a50 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
30a60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
30a70 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
30a80 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
30a90 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
30aa0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
30ab0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
30ac0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
30ad0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
30ae0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
30af0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
30b00 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
30b10 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
30b20 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
30b30 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
30b40 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
30b50 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
30b60 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
30b70 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
30b80 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
30b90 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
30ba0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
30bb0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
30bc0 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
30bd0 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
30be0 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
30bf0 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
30c00 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
30c10 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
30c20 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
30c30 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
30c40 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
30c50 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
30c60 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
30c70 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
30c80 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
30c90 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
30ca0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
30cb0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
30cc0 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
30cd0 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
30ce0 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
30cf0 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
30d00 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
30d10 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
30d20 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
30d30 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
30d40 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
30d50 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
30d60 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
30d70 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
30d80 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
30d90 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
30da0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
30db0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
30dc0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
30dd0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
30de0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
30df0 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c      int pid, fd,
30e00 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72   got;.    fd = r
30e10 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
30e20 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
30e30 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
30e40 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
30e50 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
30e60 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
30e70 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
30e80 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
30e90 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
30ea0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
30eb0 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
30ec0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
30ed0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
30ee0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
30ef0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
30f00 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
30f10 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
30f20 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
30f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30f40 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
30f50 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
30f60 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
30f70 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
30f80 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
30f90 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
30fa0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
30fb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
30fc0 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
30fd0 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
30fe0 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
30ff0 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
31000 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
31010 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
31020 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31030 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
31040 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
31050 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
31060 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
31070 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
31080 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
31090 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
310a0 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
310b0 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
310c0 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
310d0 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
310e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
310f0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
31100 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
31110 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
31120 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
31130 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
31140 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
31150 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
31160 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
31170 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
31180 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
31190 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
311a0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
311b0 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
311c0 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
311d0 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
311e0 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
311f0 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
31200 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31210 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
31220 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
31230 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  ds;.#elif define
31240 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
31250 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
31260 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
31270 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
31280 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31290 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
312a0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
312b0 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
312c0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
312d0 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
312e0 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
312f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31300 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31310 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
31320 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
31330 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
31340 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
31350 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
31360 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
31370 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
31380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
31390 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
313a0 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
313b0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
313c0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
313d0 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
313e0 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
313f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
31400 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
31410 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
31420 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
31430 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
31440 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
31450 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
31460 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
31470 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
31480 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
31490 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
314a0 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
314b0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
314c0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
314d0 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
314e0 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
314f0 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
31500 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
31510 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
31520 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
31530 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
31540 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
31550 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
31560 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
31570 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
31580 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
31590 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
315a0 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
315b0 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
315c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
315d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
315e0 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
315f0 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
31600 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
31610 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
31620 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
31630 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31640 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
31650 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
31660 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
31670 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
31680 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
31690 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
316a0 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d  0000;.  int rc =
316b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20   SQLITE_OK;.#if 
316c0 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
316d0 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
316e0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
316f0 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
31700 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
31710 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
31720 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
31730 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
31740 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
31750 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
31760 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
31770 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
31780 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
31790 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
317a0 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
317b0 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
317c0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
317d0 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65  l sNow;.  if( ge
317e0 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
317f0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  , 0)==0 ){.    *
31800 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
31810 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
31820 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
31830 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
31840 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65  ec/1000;.  }else
31850 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
31860 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
31870 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
31880 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
31890 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
318a0 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
318b0 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
318c0 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
318d0 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
318e0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
318f0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
31900 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31920 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
31930 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
31940 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
31950 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
31960 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
31970 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
31980 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
31990 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
319a0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
319b0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
319c0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
319d0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
319e0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
319f0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
31a00 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
31a10 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
31a20 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
31a30 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
31a40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
31a50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31a60 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
31a70 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
31a80 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
31a90 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
31aa0 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
31ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  ;.}../*.** We ad
31ac0 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
31ad0 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
31ae0 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
31af0 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
31b00 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
31b10 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
31b20 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
31b30 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
31b40 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
31b50 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
31b60 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
31b70 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
31b80 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
31b90 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
31ba0 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
31bb0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
31bc0 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
31bd0 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
31be0 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
31bf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31c00 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
31c10 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31c20 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
31c30 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
31c40 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
31c50 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31c60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31c70 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
31c80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31c90 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
31ca0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
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 20 45 6e 64 20 6f 66 20  ******** End of 
31cd0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
31ce0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
31cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
31d50 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
31d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31da0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
31db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
31dc0 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
31dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31df0 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
31e00 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
31e10 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
31e20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
31e30 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
31e40 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
31e50 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
31e60 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
31e70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
31e80 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
31e90 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
31ea0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
31eb0 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
31ec0 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
31ed0 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
31ee0 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
31ef0 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
31f00 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
31f10 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
31f20 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
31f30 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
31f40 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
31f50 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
31f60 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
31f70 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
31f80 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
31f90 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
31fa0 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
31fb0 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
31fc0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
31fd0 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
31fe0 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
31ff0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
32000 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
32010 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
32020 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
32030 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
32040 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
32050 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
32060 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
32070 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
32080 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
32090 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
320a0 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
320b0 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
320c0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
320d0 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
320e0 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
320f0 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
32100 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
32110 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
32120 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
32130 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
32140 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
32150 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
32160 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
32170 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
32180 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
32190 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
321a0 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
321b0 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
321c0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
321d0 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
321e0 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
321f0 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
32200 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
32210 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
32220 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
32230 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
32240 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
32250 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
32260 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
32270 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
32280 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
32290 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
322a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
322b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
322c0 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
322d0 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20   0x40000000.**  
322e0 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
322f0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
32300 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
32310 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
32320 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
32330 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
32340 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
32350 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
32360 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
32370 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
32380 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
32390 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
323a0 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
323b0 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
323c0 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
323d0 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
323e0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
323f0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
32400 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
32410 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
32420 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
32430 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
32440 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
32450 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
32460 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
32470 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
32480 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
32490 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
324a0 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
324b0 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
324c0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
324d0 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
324e0 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
324f0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
32500 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
32510 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
32520 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
32530 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
32540 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
32550 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
32560 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
32570 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
32580 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
32590 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
325a0 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
325b0 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
325c0 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
325d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
325e0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
325f0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
32600 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
32610 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
32620 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
32630 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
32640 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
32650 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
32660 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
32670 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
32680 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
32690 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
326a0 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
326b0 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
326c0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
326d0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
326e0 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
326f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32700 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
32710 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
32720 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
32730 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
32740 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
32750 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
32760 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
32770 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
32780 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
32790 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
327a0 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
327b0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
327c0 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
327d0 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
327e0 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
327f0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
32800 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
32810 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
32820 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
32830 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
32840 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
32850 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
32860 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
32870 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
32880 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
32890 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
328a0 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
328b0 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
328c0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
328d0 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
328e0 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
328f0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
32900 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
32910 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
32920 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
32930 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
32940 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
32950 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
32960 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
32970 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
32980 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
32990 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
329a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
329b0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
329c0 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
329d0 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
329e0 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
329f0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
32a00 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
32a10 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
32a20 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
32a30 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
32a40 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
32a50 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
32a60 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
32a70 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
32a80 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
32a90 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
32aa0 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
32ab0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
32ac0 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
32ad0 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
32ae0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
32af0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
32b00 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
32b10 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
32b20 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
32b30 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
32b40 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
32b50 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
32b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
32b70 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
32b80 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
32b90 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
32ba0 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
32bb0 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
32bc0 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
32bd0 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
32be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32bf0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
32c00 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
32c10 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
32c20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
32c30 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
32c40 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
32c50 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
32c60 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
32c70 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
32c80 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
32c90 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
32ca0 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
32cb0 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
32cc0 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
32cd0 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
32ce0 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
32cf0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
32d00 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
32d10 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
32d20 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
32d30 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
32d40 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
32d50 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
32d60 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
32d70 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
32d80 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
32d90 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
32da0 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
32db0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
32dc0 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
32dd0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32de0 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
32df0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
32e00 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
32e10 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
32e20 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
32e30 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
32e40 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
32e50 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
32e60 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
32e70 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
32e80 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
32e90 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
32ea0 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
32eb0 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
32ec0 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
32ed0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
32ee0 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
32ef0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
32f00 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
32f10 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
32f20 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
32f30 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
32f40 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
32f50 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
32f60 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
32f70 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
32f80 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
32f90 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
32fa0 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
32fb0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
32fc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
32fd0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
32fe0 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
32ff0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
33000 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
33010 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
33020 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
33030 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
33040 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
33050 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
33060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33070 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
33080 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
33090 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
330a0 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
330b0 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
330c0 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
330d0 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
330e0 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
330f0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
33100 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
33110 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
33120 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
33130 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
33140 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
33150 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
33160 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
33170 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
33180 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
33190 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
331a0 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
331b0 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
331c0 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
331d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
331e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
331f0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
33200 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
33210 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
33220 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
33230 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
33240 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
33250 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
33260 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33270 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
33280 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
33290 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
332a0 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
332b0 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
332c0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
332d0 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
332e0 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
332f0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
33300 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
33310 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
33320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
33330 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
33340 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
33350 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
33360 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
33370 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
33380 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
33390 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
333a0 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
333b0 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
333c0 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
333d0 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
333e0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
333f0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
33400 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
33410 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
33420 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
33430 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
33440 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
33450 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
33460 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
33470 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
33480 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
33490 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
334a0 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
334b0 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
334c0 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
334d0 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
334e0 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
334f0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
33500 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
33510 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
33520 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
33530 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
33540 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
33550 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
33560 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
33570 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
33580 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
33590 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
335a0 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
335b0 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
335c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
335d0 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
335e0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
335f0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
33600 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
33610 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
33620 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
33630 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
33640 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
33650 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
33660 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
33670 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
33680 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
33690 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
336a0 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
336b0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
336c0 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
336d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
336e0 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
336f0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
33700 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
33710 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
33720 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
33730 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
33740 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
33750 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
33760 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
33770 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
33780 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
33790 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
337a0 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
337b0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
337c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
337d0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
337e0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
337f0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
33800 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
33810 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
33820 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
33830 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
33840 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
33850 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
33860 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
33870 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
33880 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
33890 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
338a0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
338b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
338c0 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
338d0 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
338e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
338f0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
33900 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
33910 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
33920 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
33930 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
33940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
33950 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
33960 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
33970 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
33980 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
33990 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
339a0 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
339b0 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
339c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
339d0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
339e0 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
339f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a00 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
33a10 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
33a20 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
33a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
33a40 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
33a50 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
33a60 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
33a70 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
33a80 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
33a90 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
33aa0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
33ab0 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
33ac0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
33ad0 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
33ae0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
33af0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
33b00 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
33b10 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
33b20 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
33b30 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
33b40 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
33b50 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
33b60 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
33b70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
33b80 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
33b90 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
33ba0 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
33bb0 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
33bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
33bd0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
33be0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
33bf0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
33c00 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
33c10 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
33c20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
33c30 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
33c40 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
33c50 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
33c60 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
33c70 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
33c80 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
33c90 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
33ca0 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
33cb0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
33cc0 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
33cd0 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
33ce0 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
33cf0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
33d00 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
33d10 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
33d20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
33d30 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  o, getpid()));. 
33d40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33d50 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
33d60 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
33d70 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
33d80 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
33d90 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
33da0 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
33db0 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
33dc0 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
33dd0 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
33de0 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
33df0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
33e00 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
33e10 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
33e20 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
33e30 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
33e40 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
33e50 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
33e60 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
33e70 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
33e80 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
33e90 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
33ea0 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
33eb0 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
33ec0 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
33ed0 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
33ee0 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
33ef0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
33f00 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
33f10 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
33f20 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
33f30 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
33f40 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
33f50 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
33f60 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
33f70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
33f80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
33f90 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
33fa0 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
33fb0 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
33fc0 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
33fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
33fe0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
33ff0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
34000 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
34010 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
34020 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
34030 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
34040 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
34050 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
34060 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
34070 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
34080 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
34090 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
340a0 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
340b0 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
340c0 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
340d0 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
340e0 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
340f0 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
34100 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
34110 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
34120 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
34130 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
34140 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
34150 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
34160 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
34170 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
34180 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
34190 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
341a0 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
341b0 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
341c0 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
341d0 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
341e0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
341f0 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
34200 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62     if( osMkdir(b
34210 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  uf, SQLITE_DEFAU
34220 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
34230 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
34240 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
34250 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rno;.          i
34260 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
34270 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
34280 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
34290 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20  OCKPATH  FAILED 
342a0 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20  creating %s, ". 
342b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342c0 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20      "'%s' proxy 
342d0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
342e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
342f0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
34300 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c  , strerror(err),
34310 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
34320 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  d()));.         
34330 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20     return err;. 
34340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34360 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20     start=i+1;.  
34370 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d    }.    buf[i] =
34380 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20   lockPath[i];.  
34390 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52  }.  OSTRACE(("CR
343a0 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72  EATELOCKPATH  pr
343b0 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
343c0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b   pid=%d\n", lock
343d0 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
343e0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
343f0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
34400 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
34410 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
34420 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
34430 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
34440 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
34450 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
34460 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
34470 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
34480 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
34490 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
344a0 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
344b0 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
344c0 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
344d0 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
344e0 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
344f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
34500 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
34510 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
34520 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
34530 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
34540 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
34550 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
34560 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
34570 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
34580 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
34590 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
345a0 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
345b0 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
345c0 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
345d0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
345e0 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
345f0 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
34600 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
34610 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
34620 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
34630 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34640 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
34650 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
34660 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
34670 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
34680 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
34690 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
346a0 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
346b0 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
346c0 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
346d0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
346e0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
346f0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
34700 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
34710 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
34720 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
34730 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
34740 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
34750 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
34760 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
34770 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
34780 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
34790 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
347a0 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
347b0 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
347c0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
347d0 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
347e0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
347f0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
34800 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
34810 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
34820 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
34830 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
34840 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
34850 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
34860 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
34870 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
34880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34890 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
348a0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
348b0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
348c0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
348d0 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
348e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
348f0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
34900 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
34910 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
34920 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
34930 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
34940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34950 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
34960 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
34970 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
34980 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
34990 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
349a0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
349b0 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
349c0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
349d0 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
349e0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
349f0 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
34a00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
34a10 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
34a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
34a30 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
34a40 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
34a50 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
34a60 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
34a70 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
34a80 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
34a90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34aa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
34ab0 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
34ac0 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
34ad0 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
34ae0 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
34af0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
34b00 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
34b10 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
34b20 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
34b30 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
34b40 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
34b50 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
34b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
34b70 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
34b80 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
34b90 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
34ba0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
34bb0 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
34bc0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
34bd0 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
34be0 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
34bf0 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
34c00 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
34c10 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
34c20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
34c30 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
34c40 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
34c50 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
34c60 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
34c70 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
34c80 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
34c90 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
34ca0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
34cb0 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
34cc0 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
34cd0 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29  *)pNew, path, 0)
34ce0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
34d00 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
34d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34d20 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
34d30 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72  e_proxy:    .  r
34d40 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
34d50 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
34d60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
34d70 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  pNew);.  sqlite3
34d80 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a  _free(pUnused);.
34d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34da0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
34db0 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
34dc0 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
34dd0 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
34de0 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
34df0 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
34e00 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
34e10 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
34e20 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  e PROXY_HOSTIDLE
34e30 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63  N    16  /* conc
34e40 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c  h file host id l
34e50 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74  ength */../* Not
34e60 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20   always defined 
34e70 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61  in the headers a
34e80 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  s it ought to be
34e90 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67   */.extern int g
34ea0 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f  ethostuuid(uuid_
34eb0 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75  t id, const stru
34ec0 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69  ct timespec *wai
34ed0 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  t);../* get the 
34ee0 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68  host ID via geth
34ef0 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74  ostuuid(), pHost
34f00 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ID must point to
34f10 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
34f20 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72   .** bytes of wr
34f30 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  itable memory..*
34f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34f50 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69  xyGetHostID(unsi
34f60 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74  gned char *pHost
34f70 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
34f80 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59  {.  assert(PROXY
34f90 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69  _HOSTIDLEN == si
34fa0 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20  zeof(uuid_t));. 
34fb0 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c   memset(pHostID,
34fc0 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   0, PROXY_HOSTID
34fd0 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  LEN);.#if define
34fe0 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52  d(__MAX_OS_X_VER
34ff0 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
35000 44 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  D)\.            
35010 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58     && __MAC_OS_X
35020 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
35030 55 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20  UIRED<1050.  {. 
35040 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
35050 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
35060 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d  timeout = {1, 0}
35070 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f  ; /* 1 sec timeo
35080 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  ut */.    if( ge
35090 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49  thostuuid(pHostI
350a0 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a  D, &timeout) ){.
350b0 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
350c0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
350d0 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
350e0 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
350f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
35110 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
35120 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
35130 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b  RAMETER(pError);
35140 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
35150 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
35160 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
35170 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
35180 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
35190 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
351a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f    if( sqlite3_ho
351b0 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a  stid_num != 0){.
351c0 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d      pHostID[0] =
351d0 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b   (char)(pHostID[
351e0 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69  0] + (char)(sqli
351f0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26  te3_hostid_num &
35200 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e   0xFF));.  }.#en
35210 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  dif.  .  return 
35220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
35230 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
35240 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61  contains the hea
35250 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64  der, host id and
35260 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
35270 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
35280 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32  Y_CONCHVERSION 2
35290 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61     /* 1-byte hea
352a0 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73  der, 16-byte hos
352b0 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64  t id, path */.#d
352c0 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44  efine PROXY_HEAD
352d0 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20  ERLEN    1   /* 
352e0 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65  conch file heade
352f0 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66  r length */.#def
35300 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  ine PROXY_PATHIN
35310 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45  DEX    (PROXY_HE
35320 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
35330 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65  STIDLEN).#define
35340 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
35350 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45  EN  (PROXY_HEADE
35360 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
35370 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29  DLEN+MAXPATHLEN)
35380 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61  ../* .** Takes a
35390 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  n open conch fil
353a0 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f  e, copies the co
353b0 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20  ntents to a new 
353c0 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f  path and then mo
353d0 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e  ves .** it back.
353e0 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61    The newly crea
353f0 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20  ted file's file 
35400 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73  descriptor is as
35410 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a  signed to the.**
35420 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75   conch file stru
35430 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c  cture and finall
35440 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  y the original c
35450 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  onch file descri
35460 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73  ptor is .** clos
35470 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72  ed.  Returns zer
35480 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  o if successful.
35490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
354a0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
354b0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
354c0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
354d0 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  tID){.  proxyLoc
354e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
354f0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
35500 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
35510 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35520 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
35530 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
35540 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68  >conchFile;.  ch
35550 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48  ar tPath[MAXPATH
35560 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66  LEN];.  char buf
35570 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
35580 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61  EN];.  char *cPa
35590 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  th = pCtx->conch
355a0 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65  FilePath;.  size
355b0 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  _t readLen = 0;.
355c0 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
355d0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72   = 0;.  char err
355e0 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20  msg[64] = "";.  
355f0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
35600 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e  nt rc = -1;.  UN
35610 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
35620 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20  yHostID);..  /* 
35630 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74  create a new pat
35640 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65  h by replace the
35650 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63   trailing '-conc
35660 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27  h' with '-break'
35670 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20   */.  pathLen = 
35680 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63  strlcpy(tPath, c
35690 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
356a0 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e  );.  if( pathLen
356b0 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70  >MAXPATHLEN || p
356c0 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20  athLen<6 || .   
356d0 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74    (strlcpy(&tPat
356e0 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62  h[pathLen-5], "b
356f0 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20  reak", 6) != 5) 
35700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
35710 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
35720 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70  rrmsg),errmsg,"p
35730 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ath error (len %
35740 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e  d)",(int)pathLen
35750 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
35760 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
35770 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e   /* read the con
35780 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ch content */.  
35790 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61  readLen = osPrea
357a0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
357b0 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
357c0 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
357d0 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
357e0 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
357f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35800 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
35810 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72  ,errmsg,"read er
35820 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
35830 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20  nt)readLen);.   
35840 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
35850 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72  ock;.  }.  /* wr
35860 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
35870 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61  e temporary brea
35880 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d  k file */.  fd =
35890 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61   robust_open(tPa
358a0 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
358b0 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b  EAT|O_EXCL), 0);
358c0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
358d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
358e0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
358f0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
35900 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
35910 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
35920 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
35930 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
35940 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
35950 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
35960 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
35970 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35980 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
35990 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
359a0 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
359b0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
359c0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
359d0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
359e0 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
359f0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
35a00 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
35a10 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
35a20 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
35a30 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
35a40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
35a50 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
35a60 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
35a70 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
35a80 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
35a90 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
35aa0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
35ab0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
35ac0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
35ad0 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
35ae0 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
35af0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
35b00 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
35b10 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
35b20 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
35b30 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
35b40 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
35b50 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
35b60 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
35b70 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
35b80 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
35b90 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
35ba0 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
35bb0 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
35bc0 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
35bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35be0 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
35bf0 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
35c00 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
35c10 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
35c20 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
35c30 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
35c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35c50 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
35c60 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
35c70 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
35c80 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
35c90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35ca0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
35cb0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35cc0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
35cd0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
35ce0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35cf0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
35d00 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
35d10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35d20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
35d30 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
35d40 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
35d50 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f   memset(&conchMo
35d60 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  dTime, 0, sizeof
35d70 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b  (conchModTime));
35d80 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
35d90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
35da0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
35db0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
35dc0 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
35dd0 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
35de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35df0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
35e00 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
35e10 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
35e20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
35e30 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
35e40 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
35e50 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
35e60 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
35e70 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
35e80 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
35e90 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
35ea0 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
35eb0 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
35ec0 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
35ed0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
35ee0 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
35ef0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
35f00 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
35f10 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
35f20 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
35f30 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
35f40 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
35f50 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
35f60 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
35f70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
35f80 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
35f90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35fa0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
35fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
35fc0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
35fd0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
35fe0 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
35ff0 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
36000 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
36010 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
36020 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
36030 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
36040 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
36050 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
36060 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
36070 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
36080 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
36090 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
360a0 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
360b0 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
360c0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
360d0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
360e0 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
360f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36100 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
36110 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
36120 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
36130 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
36140 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
36150 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
36160 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
36170 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
36180 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
36190 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
361a0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
361b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
361c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
361d0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
361e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
361f0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
36200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
36210 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
36220 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
36230 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
36240 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
36250 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
36260 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
36270 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
36280 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
36290 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
362a0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
362b0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
362c0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
362d0 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
362e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
362f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
36300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36320 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
36330 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
36340 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
36350 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
36360 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36370 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
36380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36390 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
363a0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
363b0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
363c0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
363d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
363e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
363f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
36400 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
36410 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
36420 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
36430 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
36440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
36450 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
36460 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
36470 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
36480 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
36490 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
364a0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
364b0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
364c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
364d0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
364e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
364f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
36500 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
36510 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
36520 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
36530 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
36540 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
36550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
36560 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
36570 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
36580 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
36590 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
365a0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
365b0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
365c0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
365d0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
365e0 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
365f0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
36600 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
36610 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
36620 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
36630 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
36640 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
36650 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
36660 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
36670 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
36680 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
36690 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
366a0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
366b0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
366c0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
366d0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
366e0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
366f0 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
36700 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
36710 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
36720 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36730 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36740 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36750 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36760 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
36770 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
36780 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36790 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
367a0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
367b0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
367c0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
367d0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
367e0 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
367f0 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
36800 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
36810 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
36820 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
36830 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
36840 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
36850 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
36860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36870 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
36880 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
36890 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
368a0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
368b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
368c0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
368d0 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
368e0 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
368f0 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
36900 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
36910 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
36920 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
36930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
36940 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36950 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
36960 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
36970 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
36980 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
36990 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
369a0 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
369b0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
369c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
369d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
369e0 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
369f0 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
36a00 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
36a10 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
36a20 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
36a30 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
36a40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
36a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36a60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
36a70 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
36a80 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
36a90 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
36aa0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
36ab0 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
36ac0 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
36ad0 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
36ae0 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
36af0 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
36b00 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
36b10 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
36b20 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
36b30 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
36b40 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
36b50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
36b60 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
36b70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
36b80 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
36b90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
36ba0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
36bb0 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
36bc0 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
36bd0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
36be0 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
36bf0 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
36c00 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
36c10 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
36c20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
36c30 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
36c40 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
36c50 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
36c60 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
36c70 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
36c80 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
36c90 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
36ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
36cb0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
36cc0 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
36cd0 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
36ce0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
36cf0 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
36d00 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
36d10 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
36d20 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
36d30 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
36d40 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
36d50 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
36d60 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
36d70 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
36d80 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
36d90 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
36da0 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
36db0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
36dc0 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
36dd0 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
36de0 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
36df0 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
36e00 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
36e10 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
36e20 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
36e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e50 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
36e60 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
36e70 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
36e80 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
36e90 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
36ea0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
36eb0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
36ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
36ed0 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
36ee0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
36ef0 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
36f00 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
36f10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
36f20 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
36f30 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
36f40 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
36f50 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
36f60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
36f70 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
36f80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
36f90 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
36fa0 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
36fb0 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
36fc0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
36fd0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
36fe0 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
36ff0 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
37000 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
37010 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
37020 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
37030 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
37040 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
37050 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
37060 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
37070 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
37080 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
37090 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
370a0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
370b0 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
370c0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
370d0 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
370e0 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
370f0 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
37100 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
37110 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
37120 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
37130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
37150 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
37160 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
37170 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
37180 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
37190 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
371a0 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
371b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
371c0 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
371d0 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
371e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
371f0 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
37200 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
37210 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
37220 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
37230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37240 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
37250 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
37260 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
37270 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
37280 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
37290 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
372a0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
372b0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
372c0 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
372d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
372e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
372f0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
37300 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37310 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
37320 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
37330 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
37340 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
37350 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
37360 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37370 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
37380 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
37390 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
373a0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
373b0 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
373c0 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
373d0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
373e0 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
373f0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
37400 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
37410 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
37420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
37430 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
37440 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
37450 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
37460 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
37470 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
37480 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
37490 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
374a0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
374b0 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
374c0 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
374d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
374e0 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
374f0 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
37500 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
37510 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
37520 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
37530 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
37540 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
37550 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
37560 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
37570 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
37580 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
37590 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
375a0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
375b0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
375c0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
375d0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
375e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
375f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37600 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
37610 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
37620 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
37630 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
37640 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
37650 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
37660 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
37670 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37680 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
37690 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
376a0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
376b0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
376c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
376d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
376e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
376f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
37700 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
37710 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37720 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
37730 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
37740 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
37750 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
37760 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
37770 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
37780 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
37790 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
377a0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
377b0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
377c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
377d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
377e0 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
377f0 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
37800 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
37810 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
37820 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
37830 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
37840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37850 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
37860 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
37870 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
37880 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
37890 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
378a0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
378b0 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
378c0 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
378d0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
378e0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
378f0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66          robust_f
37900 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
37910 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
37920 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
37930 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
37940 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
37950 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
37960 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
37970 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
37980 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
37990 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
379a0 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
379b0 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
379c0 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
379d0 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
379e0 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
379f0 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
37a00 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
37a10 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
37a20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
37a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
37a40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37a50 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
37a60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
37a70 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
37a80 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
37a90 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
37aa0 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
37ab0 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
37ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
37ad0 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
37ae0 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
37af0 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
37b00 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b30 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
37b40 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
37b50 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
37b60 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
37b70 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
37b80 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
37b90 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
37ba0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
37bb0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
37bc0 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
37bd0 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23  le->h, cmode);.#
37be0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
37bf0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
37c00 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64     rc = osFchmod
37c10 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
37c20 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
37c30 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
37c40 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
37c50 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
37c60 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
37c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
37c80 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
37c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
37ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
37cb0 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
37cc0 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ce0 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
37cf0 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
37d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
37d10 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
37d20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
37d30 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
37d40 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
37d50 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
37d60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
37d70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
37d80 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
37d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
37da0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
37db0 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
37dc0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
37dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37de0 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
37df0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
37e00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
37e10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37e20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
37e30 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
37e40 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
37e50 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37e60 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
37e70 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
37e80 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
37e90 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
37ea0 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
37eb0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
37ec0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37ed0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
37ee0 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
37ef0 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20       int fd;.   
37f00 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
37f10 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
37f20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37f30 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
37f40 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
37f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
37f60 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
37f70 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
37f80 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
37f90 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
37fa0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
37fb0 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
37fc0 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
37fd0 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20  n", fd));.      
37fe0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
37ff0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
38000 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20  h = fd;.        
38010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
38020 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
38030 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c  PEN_BKPT; /* SQL
38040 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54  ITE_BUSY? proxyT
38050 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a  akeConch called.
38060 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e             durin
38070 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  g locking */.   
38080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38090 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
380a0 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d  ITE_OK && !pCtx-
380b0 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20  >lockProxy ){.  
380c0 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
380d0 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   = tempLockPath 
380e0 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a  ? tempLockPath :
380f0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38100 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63  Path;.        rc
38110 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
38120 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43  ixFile(path, &pC
38130 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31  tx->lockProxy, 1
38140 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
38150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
38160 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
38170 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61   && tryOldLockPa
38180 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
38190 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63  /* we couldn't c
381a0 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20  reate the proxy 
381b0 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74  lock file with t
381c0 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65  he old lock file
381d0 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
381e0 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e   ** so try again
381f0 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67   via auto-naming
38200 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a   .           */.
38210 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e            forceN
38220 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ewLockPath = 1;.
38230 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
38240 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
38250 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
38260 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20  ; /* go back to 
38270 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20  the do {} while 
38280 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79  start point, try
38290 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
382a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
382b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
382c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
382d0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  * Need to make a
382e0 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66   copy of path if
382f0 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68   we extracted th
38300 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
38310 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e   ** from the con
38320 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  ch file or the p
38330 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  ath was allocate
38340 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20  d on the stack. 
38350 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
38360 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50     if( tempLockP
38370 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
38380 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38390 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
383a0 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f  StrDup(0, tempLo
383b0 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  ckPath);.       
383c0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
383d0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
383e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
383f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
38400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38410 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
38440 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
38450 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
38460 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
38470 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
38480 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
38490 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ds ){.          
384a0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
384b0 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20  t *afpCtx;.     
384c0 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61       afpCtx = (a
384d0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
384e0 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   *)pCtx->lockPro
384f0 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  xy->lockingConte
38500 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  xt;.          af
38510 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70  pCtx->dbPath = p
38520 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
38530 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  th;.        }.  
38540 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
38550 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e       conchFile->
38560 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
38570 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
38580 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
38590 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
385a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
385b0